2011-11-09 18 views
4

私はLispを学び始めていて、いくつかの異なる方法で特定のタスクを実行する際のすべての冗長性が有効かどうか疑問に思っていましたか?経験豊富なLispプログラマがこの質問に答えることができると確信しています。Lispでの冗長性

例を引用するだけです。 2つの方法で関数を作成することができます。

(defun add2 (x) (+ x 2)) 

または

(setf (symbol-function 'add2) 
    #'(lambda (x) (+ x 2)) 

私は、これは別のものを達成するための柔軟性を提供することを理解しています。しかし、なぜこのような冗長性があるのか​​についての適切な説明は、私が物事をより良く理解するのに役立ちます。

答えて

15

最初の形式が存在します。これは、関数を定義するのが便利な構文であるような共通の作業であるためです。

第2の形式は、機能定義やその他のものを生成するマクロで高度な処理を行いたい場合があるためです。

defunがなければ、2番目の形式で関数を定義することはできますが、単純なタスクは非常に困難なので、誰もLispでプログラミングすることはできません。すべてのプログラマーは、自分自身のdefunマクロを設計しており、他のすべてのプログラマーと互換性がありません。

+0

ありがとうlarsmans。 – roshang

+0

大きな説明。 –

2

既存の実装でDEFUNを見ると、単に関数を定義するだけではありません。 IDE(開発環境)の定義場所などを記録し、ドキュメントを設定し、タイプ情報を記録します。

多くの場合、Lispは機械を機能インタフェースとして公開しています。典型的な使用法は、開発環境で便利なインターフェイスと副作用を提供する一連のマクロによって行われます。

CLOSでは、機能インタフェースの下にオブジェクト指向の実装さえあることもあります。

絵は、あなたが記述する何この

macros <- used by the programmer, convenient to use 
^
    | 
functions <- user interface to the implementation 
^
    | 
CLOS (classes, instances, generic functions) <- low-level extensible machine 
1

のように見える基本的にLispの大部分は、それ自体で書かれているという事実の副作用です。したがって、通常は高レベルの定義を使用することを意図しており、その背後にある低レベルのものはプログラマが利用できます。

他の方法では実現できない高度な処理を行いたい場合は、低レベルの定義を使用できますが、通常は実装の詳細として扱うことができます。