gpt4 book ai didi

clojure - 学习一种 Lisp 有助于学习另一种吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:19 24 4
gpt4 key购买 nike

学习不同的 Lisp 语言之间是否有任何协同作用?我目前正在学习 Emacs Lisp,因为它在我的日常 Emacs 使用中立即有用,但是我对所有 Lisp 都很着迷,所以也许有一天我会学习和使用其他语言。 当我开始深入研究 Common Lisp、Scheme 或 Clojure 时,学习 Emacs Lisp 对我有帮助吗?换句话说,这对我来说是学习一门全新的语言,还是一些概念和范式很常见?我也对比较 Lisp 之间的独特差异感兴趣,当我从一个 Lisp 转到另一个时,这将是一个问题。

How to go about learning Common Lisp and Emacs Lisp?提到会有“浪费”,但没有详细说明,到什么程度。

最佳答案

如果您想学习一些较早的 Lisp 基础知识,那么 Emacs Lisp 就可以了。

  • Emacs Lisp:可以在 Emacs 中使用。包括开发环境。主流 Lisp 的旧方言。缺乏很多概念。有许多编辑器编程的扩展。 Common Lisp 和 Emacs Lisp 有一些直接的继承关系(命名、概念……)。

  • 通用 Lisp。很多好书值得学习。许多 Lisp 概念(包括 OO 编程)可以通过 Common Lisp 学习。强烈推荐。 Common Lisp 内置了最重要的 Lisp 工具,其余的由库提供。可以从中学到很多东西。

  • 方案:70 年代创建的不同 Lisp 方言。与 Emacs Lisp 或 Common Lisp 不直接兼容。许多优秀的书籍和其他教程 Material 。强烈推荐学习 Lisp 基础知识和一些更高级的东西。您对 Scheme 的研究越深入,它与 Emacs Lisp 甚至 Common Lisp 的区别就越大。

  • Clojure:非常不同的 Lisp 方言。与 Common Lisp、Emacs Lisp 或 Scheme 不兼容。共享一些概念,一些概念的工作方式不同。好书。如果您想学习一些 Lisp 或特别是 Clojure,推荐使用。 Clojure 强调函数式编程和并发编程 - 非常相关的主题。

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

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

  1. 普通口齿不清
  2. 方案
  3. Clojure
  4. Emacs 语言

举个例子:

这是 McCarthy's Lisp 中的 COLLAPSE 函数,写于 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 版本。您可以将其保留为大写或将其转换为小写。两者都有效。

(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))))))

基本上是一样的。只有定义函数的形式具有不同的名称和语法。否则代码完全相同。

试试 McCarthy 在 Common Lisp 中的例子:

CL-USER > (COLLAPSE '(((A B) ((C))) ((D (E F)) (G) ((H)))))
(A B C D E F G H)

它运行。

现在让我们使用 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 中运行而无需更改。

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

Petite Chez Scheme 中:

> (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 中它看起来会有所不同。基本上,您必须重新考虑大部分代码。

这是 Clojure 自己实现的flatten:

(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 等方言不受名称和语法的束缚。他们在各个方面进行了创新。 Scheme 仍然提供旧功能的直接版本。 Clojure 没有。 Clojure 程序员不会将此视为劣势。

关于clojure - 学习一种 Lisp 有助于学习另一种吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11243936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com