2

私は今 emacs lisp を学んでいますが、なぜコードをデータとして扱うことが有用なのか疑問に思っています。このアプローチの利点は何でしょう。これは、データとコードの間に明確な分離が存在する従来のフォンノイマンアーキテクチャの代替であるため、1つの説明を見ました。この決定の意味を理解したいのですが、アイデアを得てください。

前もってありがとう、ニック。

4

1 に答える 1

5

コードを書いてくれるコードを書くことができます。これには、次の 2 つの方法があります。

  • まず、プログラムは新しいコードをリストとして作成し、それをeval関数に渡すことができます。これにより、実行時に新しいコードが評価されます (ただし、eval乱用すべきではありません。実際には、本当に必要なときにめったに使用しないでください)。 )。理論的には、ホモイコニシティ プロパティを持たない言語でもこれを行うことができますが、それははるかに困難です。たとえば、スキームではこれを行うことができます
(define form '(x 10))
(set! form (append 'define form)
(eval form (interaction-environment)

その後、 の値はx10 になります。これは、たとえば、遺伝的プログラミングで使用できます

  • マクロを定義することもできます。マクロは、関数呼び出しのように見えるものを読み取る小さな関数ですが、プログラムがフォームの評価を開始する前(つまり、実行される前) に別のものに変換 (展開) されます。たとえば、多くの Lisporではマクロです。このコード、
(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かもしれません。

于 2014-08-26T12:00:01.067 に答える