Lisp

マクロで Ruby ライクな変数束縛をエミュレート

例えば…… (begin (= x 1) (= y 2) (begin (= x (+ x y))) (list x y)) という式で、最初の2つのイコールは let に変換され、3つ目は(たとえ入れ子になっていたとしても)すでに x が束縛されているので let ではなく setf に変換される。結果として (3 2)…

マクロを書き換えるマクロ

ちょっと思いついて、できるかなと思ってやってみたらできてしまったという類のアレ。とりあえずコード: (defmacro in-depth (&rest body) `(with-depth 0 ,@body)) (defmacro with-depth (depth-const &rest body) `(macrolet ((depth () ,depth-const) (i…

クワイン

生きてるよ!Ruby でクワイン(自分自身を出力するコード)作ってた人に触発されて、自分も Lisp と JavaScript で書いてみました。 まず Lisp バージョン。関数 write は、今回使った Racket という処理系のプリント関数。 ((lambda (x) (write `(,x ',x)))…

Racket で順列組合せを生成

最近、scheme 処理系の(?) Racket という言語を使ってみている。いわゆる batteries included の精神なのか、インスタントなサーバやプレゼン用のライブラリがあったり、図形が関数で作れたり(しかも対話環境で返り値として画像が表示される)、いろいろ…