Skip to content

Instantly share code, notes, and snippets.

@amasad
Created June 20, 2011 21:31
Show Gist options
  • Save amasad/1036633 to your computer and use it in GitHub Desktop.
Save amasad/1036633 to your computer and use it in GitHub Desktop.
unlambda
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