ちょっとしたお遊びで
function butlast(coll) return coll[1:length(coll)-1] end function printSexp(expr) if(typeof(expr) == Expr) print("(") printSexp(expr.head) print(" ") for arg=butlast(expr.args) printSexp(arg) print(" ") end printSexp(expr.args[length(expr.args)]) print(")") else print(expr) end end
こんなかんじ
printSexp( quote function makeAddr(x) y -> x + y end end )
(block (line 23) (function (call makeAddr x) (block (line 24 print-sexpr.j) (-> y (call + x y)))))
なぜかlineという物がはいってくるんですよね..デバッグプリントかなぁ。
追記
lineはパース時に行番号を補完しておいてエラー発生時に参考にするための物だそうです。
そこで
function printSexp(expr) if(typeof(expr) == Expr) if string(expr.head) != "line" print("(") printSexp(expr.head) print(" ") for arg=butlast(expr.args) printSexp(arg) print(" ") end printSexp(expr.args[length(expr.args)]) print(")") end else print(expr) end end
とすると、ちゃんとlineの式は消えた状態で出力されます。