学习一个Lisp有助于学习另一个吗?

Mir*_*lov 9 lisp scheme elisp clojure common-lisp

学习不同的Lisp语言之间是否有任何协同作用?我正在学习Emacs Lisp,因为它在我的日常Emacs使用中立即有用,但是我对所有Lisps着迷,所以也许有一天我会学习和使用其他人.当我开始挖掘Common Lisp,Scheme或Clojure时,学习Emacs Lisp会帮助我吗?换句话说,对我来说,学习一门全新的语言,或者某些概念和范例是否常见?我也有兴趣比较Lisps之间的独特差异,这将是一个问题,当我从一个Lisp到另一个.

如何学习Common Lisp和Emacs Lisp?有人提到会有"浪费",但没有详细说明,程度如何.

Rai*_*wig 18

如果你想学习一些旧的Lisp基础知识,那么Emacs Lisp就可以了.

  • Emacs Lisp:可以在Emacs中使用.包括开发环境.主流Lisp的老方言.缺乏很多概念.有很多编辑器编程扩展.Common Lisp和Emacs Lisp共享一些直接遗产(命名,概念......).

  • Common Lisp.很多好书可供学习.使用Common Lisp可以学习很多Lisp概念(包括OO编程).强烈推荐.Common Lisp内置了最重要的Lisp工具,其余的库提供了库.周围有大量的东西可以学习.

  • 方案:70年代创造的不同的Lisp方言.与Emacs Lisp或Common Lisp不直接兼容.大量优秀的书籍和其他教程材料.强烈建议学习Lisp基础知识和一些更高级的东西.你越深入了解Scheme,它看起来与Emacs Lisp甚至Common Lisp有所不同.

  • Clojure:Lisp方言非常不同.与Common Lisp,Emacs Lisp或Scheme不兼容.分享一些概念,一些概念的作用不同.好书.如果你想学习一些Lisp或特别是Clojure,推荐使用.Clojure强调功能和并发编程 - 非常相关的主题.

如果你想学习更多主流的Lisp(一个具有典型Lisp方言的外观和感觉的Lisp),我会推荐Common Lisp或Scheme.

我学习Lisp(!)的语言偏好是:

  1. Common Lisp
  2. 方案
  3. Clojure的
  4. Emacs Lisp

举个例子:

这是麦卡锡的LispCOLLAPSE函数,写于1960年(来自Lisp I程序员手册,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)))))
))))))
Run Code Online (Sandbox Code Playgroud)

这是Common Lisp版本.您可以将其保留为大写或将其转换为小写.两者都有效.

(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))))))
Run Code Online (Sandbox Code Playgroud)

它基本上是一样的.只有用于定义函数的表单具有不同的名称和语法.否则代码完全相同.

试试McCarthy在Common Lisp中的例子:

CL-USER > (COLLAPSE '(((A B) ((C))) ((D (E F)) (G) ((H)))))
(A B C D E F G H)
Run Code Online (Sandbox Code Playgroud)

它运行.

现在让我们使用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)
Run Code Online (Sandbox Code Playgroud)

它在Emacs Lisp中运行而没有任何变化.

您可以在Scheme(次要重命名)中获得类似的版本:

Petite Chez计划中:

> (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)))))))
Run Code Online (Sandbox Code Playgroud)

我们可以DEFINE用来定义一个函数.COND看起来略有不同.()是空列表.谓词有一个?补充.

> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)
Run Code Online (Sandbox Code Playgroud)

运行.

在Clojure中,它看起来会有所不同.基本上你必须重新考虑大部分代码.

这是Clojure自己的实现flatten:

(defn flatten
  [x]
  (filter (complement sequential?)
          (rest (tree-seq sequential? seq x))))
Run Code Online (Sandbox Code Playgroud)

你可以写一个flattenLisp版本的精神 - 它看起来仍然会有所不同.

来自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)))))))
Run Code Online (Sandbox Code Playgroud)

名称不同,语法不同,语义不同(适用于惰性序列而不是列表).

Common Lisp,Emacs Lisp,Visual Lisp,ISLISP等方言都试图保留传统.

Scheme或Clojure等方言都没有绑定名称和语法.他们在各个方向进行创新.Scheme仍然提供旧功能的直接版本.Clojure没有.Clojure程序员不会认为这是一个缺点.

  • 是的,我强烈反对Rainer,Common Lisp/Scheme是"更主流"的Lisp.不要误会我的意思,我喜欢CL,但Clojure是迄今为止最"真实世界"的Lisp.比较使用ASDF的难度与Leiningen/Clojars的易用性(以及对所有Java maven repos的同样简单的访问).CL开发实践有点落后,例如每个人都使用每个lib的最新主干.Clojure库往往经过充分测试,版本化,在github /直接上做贡献.CL libs通常是单狼爱好项目,几年前最后更新 (6认同)
  • 嗯.我对这个偏好顺序采取的唯一问题是它似乎没有优先考虑直接的实际可用性 - 一个Clojure闪耀的领域; 很容易找到在工作场所使用基于JVM的语言的实际机会(虽然存在一些基于JVM的Scheme实现,但很少有任何具有可比较的interop),并且可用于Clojure的库的广度远远好于可用于Clojure的库的广度.任何特定的Scheme实现(当一个人开始尝试实际工作时,那个世界中的碎片变得非常不幸). (2认同)
  • @CharlesDuffy:我非常不同意,Common Lisp专注于可用性.如果你想与JVM交互,请查看[ABCL](http://common-lisp.net/project/armedbear/),如果你想与C交互,请查看[CFFI](http:// common-lisp .NET /项目/ CFFI /).[Practical Common Lisp](http://common-lisp.net/project/cffi/)是一个很棒的教程. (2认同)
  • @Daimrod公平ABCL拥有一个大约10人的开发者社区,而Clojure拥有巨大的发展势头,拥有数千名开发人员的社区,以及相当数量的商业部署. (2认同)

mik*_*era 15

是的 - 如果您已经知道一个新的Lisp,那么获取新的Lisp要容易得多.

原因:

  • 您将理解"代码是数据"的概念和同源语言中的元编程(这可以说是使Lisps与其他语言区别开来的最大单一事物)
  • 您将能够更轻松地阅读Lisp语法.需要几周时间才能"看到"Lisp代码的结构,但在此之后它变得更加容易.一段时间后你开始忽略括号.
  • 开发风格类似,使用REPL与运行环境交互
  • 它们共享共同的习语,例如列表的使用和各种函数编程技术