Source of Nothingness - ELSE

* Menu

About | Profile | まとめ | オリジナル | xyzzy | あんてな | | 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」で挙げられているものです。
マクロとスペシャルフォームの関係は排他的ではないので、マクロでありかつスペシャルフォームというものがある実装もあるかもしれません。

まとめとして 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 関数を呼ぶとクラッシュする(http://d.hatena.ne.jp/miyamuko/20070509/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の内容で大丈夫だと思うのだけど、連絡済みなのだろうか?

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

* RandomNote : NOT検索

適当にNOT検索ができるようにしてみる。
Rubyはまだよく分からんので変なことしているかも。
どなたかうまいこと実装してくれないかなぁ。

検索語が「-」で始まる場合はNOT検索をします。
(ReadMore...)