Let's write β

プログラミング中にできたことか、思ったこととか

Juliaの式をS式風に表示

ちょっとしたお遊びで

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の式は消えた状態で出力されます。