私は今 emacs lisp を学んでいますが、なぜコードをデータとして扱うことが有用なのか疑問に思っています。このアプローチの利点は何でしょう。これは、データとコードの間に明確な分離が存在する従来のフォンノイマンアーキテクチャの代替であるため、1つの説明を見ました。この決定の意味を理解したいのですが、アイデアを得てください。
前もってありがとう、ニック。
私は今 emacs lisp を学んでいますが、なぜコードをデータとして扱うことが有用なのか疑問に思っています。このアプローチの利点は何でしょう。これは、データとコードの間に明確な分離が存在する従来のフォンノイマンアーキテクチャの代替であるため、1つの説明を見ました。この決定の意味を理解したいのですが、アイデアを得てください。
前もってありがとう、ニック。
コードを書いてくれるコードを書くことができます。これには、次の 2 つの方法があります。
eval
関数に渡すことができます。これにより、実行時に新しいコードが評価されます (ただし、eval
乱用すべきではありません。実際には、本当に必要なときにめったに使用しないでください)。 )。理論的には、ホモイコニシティ プロパティを持たない言語でもこれを行うことができますが、それははるかに困難です。たとえば、スキームではこれを行うことができます(define form '(x 10))
(set! form (append 'define form)
(eval form (interaction-environment)
その後、 の値はx
10 になります。これは、たとえば、遺伝的プログラミングで使用できます
or
ではマクロです。このコード、(or a b c)
に翻訳されます
(let ((tmp1 a))
(if tmp1
tmp1
(let ((tmp2 b))
(if tmp2
tmp2
(let ((tmp3 c))
(if tmp3
tmp3
#f))))))
関数として実装することもできますがor
、関数は戻る前にすべての引数を評価する必要があります。はマクロであるためor
、必ずしもすべての引数を評価するとは限りません。
マクロの詳細については、ウィキペディアとこのクールな本[たとえば、ここ、ここ、ここなど、ネット上の他のいくつかの場所のほかに]で読むこと ができます。eval については、ウィキペディアとこの素晴らしい本で読むことができます。
また、Paul Graham のOn Lisp (この本は完全に無料です) を読むこともできます。この本では、Common Lisp の基本をやや速いペースで説明し、その後、マクロを使用したあらゆる種類のプログラミング手法に触れ、後でLet Over Lambdaを試すことができます(一部の章のみ) 。は無料です)。
この質問とその回答を読むことは興味深いeval
かもしれません。