Posted 2008-02-04 16:05:00 GMT
del.icio.us等のArc関連でブックマークされた記事を眺めていると、ArcがLISP-1で伝統的なマクロを採用したということが話題になっているようです。
確かに名前の競合に注意を払わなくてはいけないので、面倒という気がしますが、どれだけ大変になるものなのでしょう。
書いてはいけないパターンの一覧とかあると良いなあと思うのですが…。
■
それで、そういうことを考えていて、どんどん脱線してしまい、どういう訳かLISP-2のFUNCALLについて調べていました。
このFUNCALLですが、LISP-2のCommon Lispや、Emacs Lispではお馴染だと思います。
それで、導入されたのは、LISP OARCHI((MITのAIラボのITSという当時メインで使われていたOS上のファイル))というMACLISPについての文献によれば、1973/9/15付けの記録で新しい関数の導入として説明されているので、1973年のようです。
導入の説明としては、
((CAR X) A B C)と書くのも
(FUNCALL (CAR X) A B C)と書くのも同じという説明があります。ただ、
((LAMBDA (CAR) (CAR X)) 'FOO)のような場合、関数属性をもったシンボルだと、そっちが優先されてしまうので、意図した結果になりません。それで、
((LAMBDA (CAR) (FUNCALL CAR X)) 'FOO)という風に書くことによって回避することができるようになる、と記録されています。
((LAMBDA (CAR) (CAR X)) 'FOO)という記述は意図した結果になりませんが、MACLISPでは、
('car '(1 2 3 4))共にOKです。こういう記述をするとなんとなく見た目的にLISP-1に近いですが、(#'car '(1 2 3 4))
((if t 'car 'cdr) '(1 2 3 4))
(let ((foo #'car)) (foo '(1 2 3 4)))は変数属性に値が入り、関数属性は空なのでエラーです。(fooが予め他で関数属性を持つ定義をされていれば、そっちが呼び出されます。)