Paste number 59441: First paste in 2 months here!

Index of paste annotations: 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1

Paste number 59441: First paste in 2 months here!
Pasted by: jdrake
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5
Channel:#lispcafe
Paste contents:
Raw Source | XML | Display As
(define (within? x lower upper)
  (and (<= x upper) (>= x lower)))

; rotate-char char amount lower upper -> char
; If char is within lower and upper range, increase char by amount, and if
; it goes over the upper range, then wrap around to the lower range.

(define (rotate-char in amount lower upper)
  (let
      ((in (char->integer in))
       (lower (char->integer lower))
       (upper (char->integer upper)))
    (integer->char
     (if (within? in lower upper) 
         (begin
           (set! in (+ in amount))
           (if (> in upper)
               (+ lower (- in upper) -1) 
               in))
         in))))


(define (rot13 in)
  (cond 
      ((char-lower-case? in) (rotate-char in 13 #\a #\z))
      ((char-upper-case? in) (rotate-char in 13 #\A #\Z))
      (else in)))


; I am not sure I want to think about this for now...
;(define (rotate-char2 in amount lower upper)
;  (let loop ((i in)) 
;    (cond 
;      ((< i lower) (loop (+ i amount)))
;      ((< i upper) i)
;      (else (loop (+ lower (- i upper)))))))

Annotations for this paste:

Annotation number 8: Mister Gorbachov, rewrite "within"
Pasted by: offby1
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/8
Paste contents:
Raw Source | Display As
(define (within? x lower upper) 
    (<= lower x upper))

Annotation number 7: my scary hairy dense version!! I still prefer it.
Pasted by: offby1
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/7
Paste contents:
Raw Source | Display As
(define (rot13-char c)
  (cond
   ((char-alphabetic? c)
    (let ((upper? (char-upper-case? c))
           (c (char-downcase c)))
      ((if upper?
           char-upcase
           values)
       (integer->char (+ (char->integer #\a)
                         (remainder (+ 13 (- (char->integer c)
                                             (char->integer #\a))) 26))))))
   (else
    c)
   ))

Annotation number 6: ports
Pasted by: offby1
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/6
Paste contents:
Raw Source | Display As
(define (rot13-stream in out)
  (let loop ()
    (let ((ch (read-char in)))
      (when (not (eof-object? ch))
        (display (rot13-char ch) out)
        (loop)))))

Annotation number 5: Preliminary Final Code: Comments?
Pasted by: jdrake
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/5
Paste contents:
Raw Source | Display As
#!/usr/bin/env mzscheme

; Special thanks to Vixey in #lispcafe

; within? x lower upper
; Is x is within lower to upper?
(define (within? x lower upper)
  (<= lower x upper))

; wrap-range x lower upper
; If x is above range, it will wrap from lower
; If x is below range, it will wrap from upper
; It will repeat if necessary
(define (wrap-range x lower upper)
  (cond
    ((> x upper) (wrap-range (+ lower (- x upper) -1) lower upper))
    ((< x lower) (wrap-range (- upper (- lower x) -1) lower upper))
    (else x))) 

; rotate-char char amount lower upper -> char
; If char is within lower and upper range, increase char by amount, and if
; it goes over the upper range, then wrap around to the lower range.
(define (rotate-char x amount lower upper)
  (let
      ((x (char->integer x))
       (lower (char->integer lower))
       (upper (char->integer upper)))
    (integer->char
     (if (within? x lower upper) 
         (wrap-range (+ x amount) lower upper)
         x))))

; rot13 x
; Converts char x to its rot13 equivalent
(define (rot13 x)
  (cond 
      ((char-lower-case? x) (rotate-char x 13 #\a #\z))
      ((char-upper-case? in) (rotate-char x 13 #\A #\Z))
      (else x)))

; rot13-string string
; Converts a string to its rot13 equivalent
(define (rot13-string string)
  (list->string (map rot13 (string->list string))))

Annotation number 4: Complete Code
Pasted by: jdrake
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/4
Paste contents:
Raw Source | Display As
(define (within? x lower upper)
  (and (<= x upper) (>= x lower)))

(define (wrap-range x lower upper)
  (cond
    ((> x upper) (wrap-range (+ lower (- x upper)) lower upper))
    ((< x lower) (wrap-range (- upper (- lower x)) lower upper))
    (else x))) 

; rotate-char char amount lower upper -> char
; If char is within lower and upper range, increase char by amount, and if
; it goes over the upper range, then wrap around to the lower range.
(define (rotate-char in amount lower upper)
  (let
      ((in (char->integer in))
       (lower (char->integer lower))
       (upper (char->integer upper)))
    (integer->char
     (if (within? in lower upper) 
         (wrap-range (+ in amount) lower upper)
         in))))


(define (rot13 in)
  (cond 
      ((char-lower-case? in) (rotate-char in 13 #\a #\z))
      ((char-upper-case? in) (rotate-char in 13 #\A #\Z))
      (else in)))


; I am not sure I want to think about this for now...
;(define (rotate-char2 in amount lower upper)
;  (let loop ((i in)) 
;    (cond 
;      ((< i lower) (loop (+ i amount)))
;      ((< i upper) i)
;      (else (loop (+ lower (- i upper)))))))

Annotation number 3: updated rotate-char
Pasted by: jdrake
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/3
Paste contents:
Raw Source | Display As
(define (rotate-char in amount lower upper)
  (let
      ((in (char->integer in))
       (lower (char->integer lower))
       (upper (char->integer upper)))
    (integer->char
     (if (within? in lower upper) 
         (begin
           (set! in (+ in amount))
           (wrap-range in lower upper)
         in)))))

Annotation number 2: New version
Pasted by: jdrake
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/2
Paste contents:
Raw Source | Display As
(define (wrap-range x lower upper)
  (cond
    ((> x upper) (wrap-range (+ lower (- x upper)) lower upper))
    ((< x lower) (wrap-range (- upper (- lower x)) lower upper))
    (else x))) 

Annotation number 1: Recurse no worky
Pasted by: jdrake
When:3 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+19V5/1
Paste contents:
Raw Source | Display As
(define (wrap-range x lower upper)
  (let loop ('())
  (cond
    ((> x upper) (loop (+ lower (- x upper))))
    ((< x lower) (loop (- upper (- lower x))))
    (else x)))) 

Colorize as:
Show Line Numbers
Index of paste annotations: 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.