Source of Nothingness - ELSE

* Menu

[[About:self:AboutPage.txt]] | [[Profile:file/southly/]] | [[まとめ:self:1163859357.txt]] | [[オリジナル:http://ninjinix.x0.com/rn/]] | [[xyzzy:lisp/]] | [[あんてな:listall]] | [[■:lisp]] | [[buzz:files/southly#buzz]]

* Common Lisp : 関数とマクロとスペシャルフォームの違い

http://d.hatena.ne.jp/pgf2/20080415/1208269126
ざっくりとした違いは関数は全ての引数が評価される、マクロとスペシャルフォームはそうとは限らないという点です。
関数が評価されるときは、まず引数を前から順番に評価し、全部の引数を評価したらその値を用いて関数のフォームを評価するという風に評価順序が決まっています。
マクロやスペシャルフォームは、評価順序が一定でなかったり、全ての引数が評価されなかったりします。
例えばスペシャルフォームの「if」はTHEN節とELSE節のどちらか一方しか評価されません。
評価規則が決まっている関数の枠組みでは「if」は定義できないということになります。

マクロの特徴は展開できるということです。
展開形は macroexpandmacroexpand-1 で確認できます。

スペシャルフォームは「[[3.1.2.1.2.1 Special Forms:lisp.org/HyperSpec/Body/sec_3-1-2-1-2-1.html]]」で挙げられているものです。
マクロとスペシャルフォームの関係は排他的ではないので、マクロでありかつスペシャルフォームというものがある実装もあるかもしれません。

まとめとして setq と set と setf の関係
(setq a "value") と (set (quote a) "value") はほぼ等価。(厳密には違います。xyzzyでその差が出るかどうかは不明)
(setq a "value") と (setf a "value") は等価。
なぜなら
(macroexpand '(setf a "value"))
=>(setq a "value")
だから。

* xyzzy : miyamukoさんとこの件

xyzzy で戻り値が double, float の C 関数を呼ぶとクラッシュする(70509/p1)というお話。
原因はdll.ccの247と250でしょうね。おそらくfn→proc。fnをキャストするのは明らかにおかしい。

dll.ccを眺めたのは初めてだったけれど、かなりのBynary Hacksな感じ。亀井さんスゲー!!!

--- dll.cc~	Sun Feb 25 08:58:21 2001
+++ dll.cc	Fri May 11 04:34:41 2007
@@ -244,10 +244,10 @@
       return make_integer (long_to_large_int (u_long (proc ())));
 
     case CTYPE_FLOAT:
-      return make_single_float (((float (__stdcall *)())fn)());
+      return make_single_float (((float (__stdcall *)())proc)());
 
     case CTYPE_DOUBLE:
-      return make_double_float (((double (__stdcall *)())fn)());
+      return make_double_float (((double (__stdcall *)())proc)());
     }
 #else
 # error "yet"

miyamukoさんだったら手元では直してらっしゃるんだろうな。亀井さんには連絡済みなんだろうか?

start-timerの件も[[patch/21:http://xyzzy.s53.xrea.com/wiki/index.php?patch%2F21]]の内容で大丈夫だと思うのだけど、連絡済みなのだろうか?

xyzzy MLに流してくれないと、この辺りの情報が回ってこなくて不便だよな〜と思う。

* RandomNote : NOT検索