* Menu
[[About:self:AboutPage.txt]] | [[Profile:http://iddy.jp/profile/southly/]] | [[まとめ:self:1163859357.txt]] | [[オリジナル:http://ninjinix.x0.com/rn/]] | [[xyzzy:http://raido.sakura.ne.jp/southly/xyzzy/site-lisp/]] | [[あんてな:http://i-know.jp/southly/listall]] | [[■:http://raido.sakura.ne.jp/southly/lisp/ni/view.lisp]] | [[buzz:http://www.google.com/profiles/southly#buzz]]
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: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") は等価。
なぜなら
ざっくりとした違いは関数は全ての引数が評価される、マクロとスペシャルフォームはそうとは限らないという点です。
関数が評価されるときは、まず引数を前から順番に評価し、全部の引数を評価したらその値を用いて関数のフォームを評価するという風に評価順序が決まっています。
マクロやスペシャルフォームは、評価順序が一定でなかったり、全ての引数が評価されなかったりします。
例えばスペシャルフォームの「if」はTHEN節とELSE節のどちらか一方しか評価されません。
評価規則が決まっている関数の枠組みでは「if」は定義できないということになります。
マクロの特徴は展開できるということです。
展開形は macroexpand や macroexpand-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")だから。
* lisp : 破壊とか非破壊とかの話
[[SANOさんとこ:http://snmsts.dreamhosters.com/wiki/?%C6%FC%B5%AD%A4%C3%A4%DD%A4%AF%2F2007-08-11#i7f0cca5]]の補足のつもり。(だけど補足になれているかどうかは不明)
整理し切れていないので箇条書きで。
整理し切れていないので箇条書きで。
- Common Lispのオペレータには関数・マクロ・スペシャルフォームがあるけど、この件が関係するのは関数のみ。
- 純粋な意味での「関数」はいくつかの引数をとり、結果を返すということだけをするもの。(数学における意味での「関数」に近い)
- 「関数」が結果を返すこと以外に他へ影響を与えることを副作用という。引数の破壊は副作用の一種。
- 純粋な意味での「関数」として使っていれば、引数の破壊が起こっていてもいなくても同じ結果が得られる。
- それなのにわざわざ副作用をもつ破壊的な関数を用意するのは効率のため。
- 破壊的な関数は同等の非破壊関数で置き換えられる。置き換えられない使い方は間違い。
- 非破壊関数を同等の破壊的な関数で置き換えられるかどうかは、状況次第。
- どっちを使ったら良いか分からないときは非破壊関数を使うべし。効率が悪いかもしれないけれどxyzzyで使う程度の処理で差が出るなんてことはほとんど無いと思う。
- 副作用が目的の関数(vector-popとかvector-pushとか)は引数が変更されても破壊的と称さないっぽい。
* xyzzy : 変数の種類
[[(ReadMore...) index.rb?1174689340.txt]]