古いLispの基礎を学びたいなら、Emacs Lispは問題ありません。
Emacs Lisp:Emacsで使用できます。開発環境が含まれています。主流のLispの古い方言。多くの概念が欠けている。エディタのプログラミングには多くの拡張機能があります。 Common LispとEmacs Lispは、いくつかの直接の遺産(命名、概念、...)を共有しています。
Common Lisp。学ぶべきたくさんの良い本があります。多くのLispの概念(OOプログラミングを含む)は、Common Lispで学ぶことができます。強くお勧めします。 Common Lispには最も重要なLisp機能が組み込まれており、ライブラリは残りを提供しています。その周りに学ぶことができる大量のものがあります。
スキーム:70年代に作成された異なるLispの方言。 Emacs LispまたはCommon Lispと直接互換性がありません。優れた本やチュートリアルの資料がたくさんあります。 Lispの基本といくつかのより高度なことを学ぶために強く推奨されます。スキームが深くなればなるほど、Emacs LispやCommon Lispとは異なって見えるでしょう。
Clojure:非常に異なるLisp方言。 Common Lisp、Emacs Lisp、Schemeとの互換性はありません。いくつかの概念を共有し、いくつかの概念は異なる働きをします。良い本。いくつかのLispやClojureを学びたいならおすすめです。 Clojureは機能的プログラミングと並行プログラミングを重視しています。
あなたはより多くの主流のLisp、私はCommon Lispのかスキームをお勧めします(一般的なLispの方言のルックアンドフィールにすることをLispの)を学びたいのであれば
。
のLispを学ぶための私の言語設定は次のようになり(!):
- Common Lispの
- スキーム
- Clojureの
- Emacs Lispに
あなたの例を与えるために:
これはの関数McCarthy's Lispで、1960年に書かれました(Lisp I Programmer's manual, 1960の101ページから)。これは基本的に多くのLisp演習ではFLATTEN
関数です。それはネストされたリストを取り、単一リスト内のアトムを持つ新しいリストを返します。
DEFINE
(((COLLAPSE,(LAMBDA,(L),(COND,
((ATOM,L),(CONS,L,NIL))
((NULL,(CDR,L)),
(COND,((ATOM,(CAR,L)),L),(T,(COLLAPSE,(CAR,L)))))
(T,(APPEND,(COLLAPSE,(CAR,L)),(COLLAPSE,(CDR,L)))))
))))))
これはCommon Lispのバージョンです。大文字にしたり、小文字に変換することができます。両方の作品。
これは基本的に同じです。関数を定義するための形式だけが異なる名前と構文を持っています。それ以外の場合、コードは完全に同一です。それが実行さ
CL-USER > (COLLAPSE '(((A B) ((C))) ((D (E F)) (G) ((H)))))
(A B C D E F G H)
:
はCommon Lispのでマッカーシーの例を試してみてください。
ここで、GNU Emacsを使用してEmacs Lispで試してみましょう。 Emacs Lispには、小文字の識別子を持っています
ELISP> (defun collapse (l)
(cond
((atom l) (cons l nil))
((null (cdr l))
(cond ((atom (car l)) l)
(t (collapse (car l)))))
(t (append (collapse (car l))
(collapse (cdr l))))))
ELISP> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)
それは変更せずにEmacs Lispにで実行されます。
の類似のバージョンを取得することができます。(マイナーチェンジ):。 小柄シェスキームでここ
:
> (define collapse
(lambda (l)
(cond
((atom? l) (cons l '()))
((null? (cdr l))
(cond ((atom? (car l)) l)
(else (collapse (car l)))))
(else (append (collapse (car l))
(collapse (cdr l)))))))
我々は関数を定義するためにDEFINE
を使用することができます。 COND
は少し違って見えます。 ()
は空のリストです。述語には?
が追加されています。
> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)
実行。
Clojureでは違って見えます。基本的には、コードの多くを再考する必要があります。
これはflatten
のClojureの独自の実装です:
(defn flatten
[x]
(filter (complement sequential?)
(rest (tree-seq sequential? seq x))))
あなたはLispのバージョンの精神でflatten
を書くことができます - それはまだ異なって見えるでしょう。 rosetta.orgから
:
(defn flatten [coll]
(lazy-seq
(when-let [s (seq coll)]
(if (coll? (first s))
(concat (flatten (first s)) (flatten (rest s)))
(cons (first s) (flatten (rest s)))))))
名が異なる、構文はセマンティクスが異なる場合、異なる(代わりに、リストの怠惰な配列に動作します)。
Common Lisp、Emacs Lisp、Visual Lisp、ISLISPなどの方言は、遺産を維持しようとします。
SchemeやClojureのような方言は、名前や構文に縛られていないと感じました。彼らは様々な方向で革新しました。スキームは、古い機能の直接的なバージョンを提供します。 Clojureはそうではありません。 Clojureプログラマーはこれを不利な立場には見ません。
*自分のLispを実装することは、他のリスプの学習にも役立ちます。 –