標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

let のない Lisp で lambda を let のかわりにつかう

無いものを嘆いていても仕方がないので、できることを模索しよう。

autolisp系のLispでは let が使えず、ローカル変数は、関数の頭でしか宣言できない。また、use strict 相当のものがないため、関数が長くなるとローカル変数の宣言漏れがないかどうかをチェックするのも(宣言するところと使用する場所が離れているため)結構たいへんだ。

そんな折、let が lambda の糖衣構文である処理系もあるという話を聞いた。なるほど、let は lambda の変形なのか。ということで、lambda で let 相当のことをやってみよう。

(defun C:test-lambda (/ tmp)
  (setq tmp "hogehoge")
  (princ "\nbefore=")(prin1 tmp)
  ((lambda (tmp) ; instead of (let)
           (princ "\nin lambda=")(prin1 tmp)
           ) "uhauha")
  (princ "\nafter=")(prin1 tmp)
  (princ)
)

思ったほど、見づらくない。lambda と同じ行に「; instead of let」と書くようにすれば、他の読み手にも分かってもらえそう。動作結果はどうだろう。

: TEST-LAMBDA

before="hogehoge"
in lambda="uhauha"
after="hogehoge"

よしよし