Created
June 20, 2011 21:31
-
-
Save amasad/1036633 to your computer and use it in GitHub Desktop.
unlambda
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
keywords = ['k', 's', 'i', 'v', 'c', 'd', 'e'] | |
code = '' | |
window.toPrint = '' | |
log = (s)-> window.toPrint += s | |
car = (pair) -> pair[0] | |
cdr = (pair) -> pair[1] | |
cadr = (pair) -> car cdr pair | |
caddr = (pair) -> car cdr cdr pair | |
isPair = (p) -> Array.isArray(p) | |
Token = (a, b)-> | |
return [a,b] | |
parse = () -> | |
readChar = (check) -> | |
[ret, code...] = code | |
if check and !ret? then throw new Error 'Unexpected end of file' | |
ret | |
eatComment = ()-> | |
eatComment() unless readChar() == '\n' | |
ch = readChar().toLowerCase() | |
if ch == '' then throw new Error 'Unexpected end of file' | |
if /\s/.test ch then return parse code | |
if ch == '`' | |
op = parse code | |
arg = parse code | |
return Token op, arg | |
if ch == '.' | |
return Token 'pr', readChar(1) | |
if ch == 'r' | |
return Token 'pr', '\n' | |
if ch == '@' | |
return Token 'rd' | |
if ch == '?' | |
return Token 'rc', readChar(1) | |
if ch == '|' | |
return Token 'pc' | |
if ch in keywords | |
return Token ch | |
throw new Error "Wrong #{ch}" | |
unparse = (exp) -> | |
if isPair car exp | |
log '`' | |
unparse car exp | |
unparse cdr exp | |
else | |
x = car exp | |
switch x | |
when 'k' | |
log 'k' | |
when 'k1' | |
log '`', 'k' | |
unparse cadr expr | |
when 's' | |
log 's' | |
when 's1' | |
log '`', 's' | |
unparse cadr exp | |
when 's2' | |
log '`', '`', 's' | |
unparse cadr exp | |
unparse caddr exp | |
when 'i' | |
log 'i' | |
when 'v' | |
log 'v' | |
when 'c' | |
log 'v' | |
when 'c1' | |
log 'continuation' | |
when 'd' | |
log 'd' | |
when 'd1' | |
log '`', 'd' | |
unparse cadr exp | |
when 'e' | |
log 'e' | |
when 'pr' | |
if (cadr exp) == '\n' | |
log '\n' | |
else | |
log '.' | |
log cadr exp | |
when 'rd' | |
log '@' | |
when 'rc' | |
log '?' | |
log cadr exp | |
when 'pc' | |
log '|' | |
else | |
throw new Error "err#{x}" | |
ev = (exp) -> | |
if isPair car exp | |
op = ev car exp | |
if car op == 'd' | |
return Token 'd1', cdr exp | |
else | |
return ap op, ev cdr exp | |
else | |
return exp | |
ap = (exp, arg) | |
switch car exp | |
when 'k' then Token 'k1', arg | |
when 'k1' then cadr expr | |
when 's' then Token 's1', arg | |
when 's1' then Token 's2', cadr exp, arg | |
when 's2' then ev Token('') | |
code = ''' | |
```s``s``sii`ki | |
`k.*``s``s`ks | |
``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk | |
`k``s`ksk | |
''' | |
unparse(parse(code)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment