Monthly Archives: November 2014
The Convoluted Logic of ROT13 in CCL
Playing with CCL, the Mule Code Conversion Language, I decided to write a simple ROT13 algorithm. This turned out to be tougher than expected since CCL has no concept of the logical and and or operators; what is &&
and ||
in C derived languages.
( define-ccl-program my-ccl-rot13 '(1 (( loop ( read r0) ;; The convoluted logic of rot13 in CCL. ( if (r0 > = 110) ; n ( if (r0 < = 122) ; z ((r0 -= 13))) ;; If we are between n-z ( if (r0 > = 97) ; a ( if (r0 < = 109) ; m ((r0 += 13))) ;; If we are between a-m ( if (r0 > = 78) ; N ( if (r0 < = 90) ; Z ((r0 -= 13))) ;; If we are between N-Z ( if (r0 > = 65) ; A ( if (r0 < = 77); ; M ((r0 += 13))))))) ;; If we are between A-M ( write r0) ( repeat ))))) |
One method to tackle this, as demonstrated above, is to use the if-else construct and carefully order the comparisons.
Now, in order to do something useful with this, we define the function my-rot13-word-at-point
.
( defun my-rot13-word-at-point () (interactive) ( let ((word (word-at-point))) ( if (stringp word) (message (ccl-execute-on-string 'my-ccl-rot13 [0 0 0 0 0 0 0 0 nil ] word))))) |
And now we can do M-x my-rot13-word-at-point
and we will see the word (de)cyphered in the echo area.
There is one “bug” so to speak, and that it will potentially display garbage when applied to non-ascii text, such as Japanese.
Finally, these code snippets are GPL 2 or 3 at your convenience.