* Menu
page 0 - << : 0 : >>
* Common Lisp : 関数とマクロとスペシャルフォームの違い
http://d.hatena.ne.jp/pgf2/20080415/1208269126
ざっくりとした違いは関数は全ての引数が評価される、マクロとスペシャルフォームはそうとは限らないという点です。
関数が評価されるときは、まず引数を前から順番に評価し、全部の引数を評価したらその値を用いて関数のフォームを評価するという風に評価順序が決まっています。
マクロやスペシャルフォームは、評価順序が一定でなかったり、全ての引数が評価されなかったりします。
例えばスペシャルフォームの「if」はTHEN節とELSE節のどちらか一方しか評価されません。
評価規則が決まっている関数の枠組みでは「if」は定義できないということになります。
マクロの特徴は展開できるということです。
展開形は macroexpand や macroexpand-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") は等価。
なぜなら
ざっくりとした違いは関数は全ての引数が評価される、マクロとスペシャルフォームはそうとは限らないという点です。
関数が評価されるときは、まず引数を前から順番に評価し、全部の引数を評価したらその値を用いて関数のフォームを評価するという風に評価順序が決まっています。
マクロやスペシャルフォームは、評価順序が一定でなかったり、全ての引数が評価されなかったりします。
例えばスペシャルフォームの「if」はTHEN節とELSE節のどちらか一方しか評価されません。
評価規則が決まっている関数の枠組みでは「if」は定義できないということになります。
マクロの特徴は展開できるということです。
展開形は macroexpand や macroexpand-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な感じ。亀井さんスゲー!!!
miyamukoさんだったら手元では直してらっしゃるんだろうな。亀井さんには連絡済みなんだろうか?
start-timerの件もpatch/21の内容で大丈夫だと思うのだけど、連絡済みなのだろうか?
xyzzy MLに流してくれないと、この辺りの情報が回ってこなくて不便だよな〜と思う。
原因は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...)
Rubyはまだよく分からんので変なことしているかも。
どなたかうまいこと実装してくれないかなぁ。
検索語が「-」で始まる場合はNOT検索をします。
(ReadMore...)
page 0 - << : 0 : >>