技術野郎の復讐---Revenge of the Nerds--- [practical-scheme.net]とかそこに引用されている comp.lang.lisp > How I lost my faith (very long) [google.com]を読むとLispってのは Nerds御用達言語らしいというのが想像できて、あこがれます。2つの記事を(超)要約すると 「Lispを使えば短期間で開発ができて、コードの量も非常に小さくできる。PythonはLispの再発明だ」 ということです。しかし、ヘタレなぼくにはそのすごさがいまいち理解できません。そこに書かれている (defun foo (n)
#'(lambda (i) (incf n i))) はいったい何をしたいのでしょうか。Lisperの方、教えてください。
Nerds御用達言語 (スコア:1)
comp.lang.lisp > How I lost my faith (very long) [google.com]を読むとLispってのは
Nerds御用達言語らしいというのが想像できて、あこがれます。2つの記事を(超)要約すると
「Lispを使えば短期間で開発ができて、コードの量も非常に小さくできる。PythonはLispの再発明だ」
ということです。しかし、ヘタレなぼくにはそのすごさがいまいち理解できません。そこに書かれている
(defun foo (n)
#'(lambda (i) (incf n i)))
はいったい何をしたいのでしょうか。Lisperの方、教えてください。
Rubyとの関連については
love && peace && free_software
t-nissie
Re:Nerds御用達言語 (スコア:1)
Lispに方言が多かったのは、過去の話じゃないですか。いまはANSI Common Lisp標準がありますから。もちろん処理系によって細かい差異はあるんですけど、それはC言語なんかでも同じですよね?
標準 (スコア:1)
WHY Common Lisp? [msi.co.jp]を読むとそうみたいですね。
で、SchemeにはR5RSがあると。
> In 技術野郎の復讐---Revenge of the Nerds---
> * これが、他のLisp方言におけるアキュムレータジェネレータのコードだ。
> Scheme: (define (foo n) (lambda (i) (set! n (+ n i)) n))
> Goo: (df foo (n) (op incf n _)))
> Arc: (def foo (n) [++ n _])
Emacs は (defun foo (n) '(lambda (i) (incf n i))) でしょうか。
各Lispの方言の中では標準が固まっ
love && peace && free_software
t-nissie
Re:標準 (スコア:3, 興味深い)
念のため突っ込みを入れておくと、Emacs Lispにはclosureが無いので、これは意図通りに動きません。 例えば、元コメントの関数fooを定義した後で、以下を実行してみるとCommon Lispとの違いが分かります。
Common Lispでは2, 3, 42が順に表示されますが(1.0じゃないけどSBCL 0.9.16で確認)、 Emacs Lispでは43, 44, 44が順に表示されます(Emacs 21.3で確認)。
fooの返す関数
Re:標準 (スコア:2, 参考になる)
う、調べず書くもんじゃない……。
というのは嘘でした。
Common Lisp extensions for Emacsを使うと、元コメントのアキュムレータは以下の様に定義できます。
Common Lisp Extension
まとめ (スコア:2, 興味深い)
まだclosureとか本質はわかっていませんが、とりあえず各言語で試してみました。
● Common Lisp (CLISP。sbcl-1.0 は、Linux kernel の NPTL threading を使う
らしく、今使っているちょっと古めのLinux Boxにはインストールできませんでした。)
$ clisp
[1]> (defun foo (n) #'(lambda (i) (incf n i)))
FOO
[2]> (defvar bar (foo 5))
BAR
[3]> (funcall bar 3)
8
[4]> (funcall bar 7)
15
[5]> (exit)
● Scheme (Gauche)
$ gosh
gosh> (define (foo n) (lambda (i) (set! n (+ n i)) n))
love && peace && free_software
t-nissie
Re:まとめ (スコア:1)
あ、日記 [srad.jp]でですね。 すみません、気付いてなかったので「余計なもの」になってました。(_ _)
これは、Schemeでは名前の関数値と変数値に区別がなく、 リスト先頭の要素も他の要素と同様に評価される(R5RSの"4.1.3. Procedure calls"のところ)からです。 なので、Schemeでは なんてのも書けます(R5RSより引用)。一方Common LispやEmacs Lispでは、変数値と関数値は別々に扱われます。 Common LispやEmacs Lispで、
とかやると分かると思います。 同じ名前でも関数と変数が区別される処理系では、 とか書けますが、これは逆にSchemeでは動きません。