2012-06-28 14 views
8

異なるLisp言語の学習に相乗効果はありますか?私は現在Emacs Lispを学んでいます。私の毎日のEmacsの使用にはすぐ役に立ちますが、私はすべてのLispsに魅了されています。 Common Lisp、Scheme、またはClojureで掘り出し始めると、Emacs Lispが助けになりますか?言い換えれば、まったく新しい言語を学ぶようなものか、いくつかの考え方やパラダイムが共通しているようなものでしょうか?私はまた、Lisp間でのユニークな違いの比較に興味があります1つのLispを学ぶことは他のものを学ぶのに役立ちますか?

How to go about learning Common Lisp and Emacs Lisp?には「無駄」があると言われていますが、どの程度まで精緻化されていません。

+4

*自分のLispを実装することは、他のリスプの学習にも役立ちます。 –

答えて

15

はい - 既に新しいLispを知っていれば、それを拾うのがはるかに簡単です。

理由:

  • あなたがの概念homoiconic言語とメタプログラミング「のコードがデータである」理解します(これは間違いなく他の言語から特徴的な/のLispのユニークな点の最大の単一のものである)
  • あなたはもっと簡単にLisp構文を読むことができます。 Lispコードの構造を "見て"いるところまでは数週間かかりますが、それ以降はもっと簡単になります。あなたはしばらくしてからかっこを無視し始めます。
  • 開発スタイルは似ており、REPLを使用して実行環境と対話しています。
  • これらは共通のイディオムを共有します。リストとさまざまな関数型プログラミングテクニックの使用
18

古い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を学ぶための私の言語設定は次のようになり(!):

  1. Common Lispの
  2. スキーム
  3. Clojureの
  4. 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プログラマーはこれを不利な立場には見ません。

+2

Hmm。私がこの優先順位で取る唯一の問題は、Clojureが輝く1つの領域である即時の実用的なユーザビリティに優先順位を付けるようには見えないことです。 JVMベースの言語を職場で使用するための実用的な機会を見つけるのは簡単です(JVMベースのScheme実装がいくつか存在しますが、相互に匹敵するものはほとんどありません)。Clojureで利用可能なライブラリの幅は、特定のScheme実装(実際の作業をしようとすると、その世界の断片化は非常に不幸になります)。 –

+6

はい、ライナーとは、Common Lisp/Schemeが「もっと主流の」Lispであると強く反対します。私が間違ってはいけない、私はCLが大好きですが、Clojureは最近では最も現実的なLispです。たとえば、ASDFをLeiningen/Clojars(そしてすべてのJava Maven Reposへの簡単なアクセス)の使いやすさと組み合わせることの難しさを比較してください。 CL開発の実践は少し遅れています。例えば、すべてのlibの最新トランクを使用している人です。 Clojureのlibsは、github/straightforwardに貢献するために、よくテストされ、バージョン管理されている傾向があります。 CLライブラリは一般的に孤独な狼の趣味のプロジェクトで、数年前に最後に更新されました – rplevy

+2

@CharlesDuffy:私は強く反対ですが、Common Lispはユーザビリティに重点を置いています。 [ABCL](http://common-lisp.net/project/armedbear/)のJVMと対話したい場合は、Cと対話したい場合は[CFFI](http:// common-lisp .net/project/cffi /)。そして[Practical Common Lisp](http://common-lisp.net/project/cffi/)は素晴らしいチュートリアルです。 – Daimrod

関連する問題