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

2024-01-22

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

In 如何开始学习 Common Lisp 和 Emacs Lisp? https://stackoverflow.com/q/3840443/596361提到会有“浪费”,但没有详细说明,到什么程度。


如果您想学习 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 兼容。许多优秀的书籍和其他教程材料。强烈推荐学习 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. Scheme
  3. Clojure
  4. Emacs Lisp

举个例子:

这是COLLAPSE函数来自麦卡锡的口齿不清,写于 1960 年(来自Lisp I 程序员手册,1960 年 http://www.softwarepreservation.org/projects/LISP/book/LISP%20I%20Programmers%20Manual.pdf,第 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)))))
))))))

这是通用语言版本。您可以将其保留为大写或将其转换为小写。两者都有效。

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

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

尝试麦卡锡的例子通用语言:

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

It runs.

现在让我们尝试一下Emacs Lisp,使用 GNU Emacs。 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(小改名):。

Here in 小厨房计划:

> (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看起来略有不同。()是空列表。谓词有一个? added.

> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)

Runs.

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

这是Clojure自己的实现flatten:

(defn flatten
  [x]
  (filter (complement sequential?)
          (rest (tree-seq sequential? seq x))))

你可以写一个flatten本着 Lisp 版本的精神——它看起来仍然不同。

From 罗塞塔网站 http://rosettacode.org/wiki/Flatten_a_list#Clojure:

(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 程序员不会认为这是一个缺点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习一种 Lisp 有助于学习另一种 Lisp 吗? 的相关文章

  • Clojure/Java:用于声音频谱分析的 Java 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以接受大量音频数据并返回给定频带内随时间变化的平均幅度的库 我已经在 comp dsp
  • 方案语言:合并两个数字

    如何将列表中的两个整数合并为一个 方案中 例子 11 223 gt 11223 假设列表恰好有两个元素 并且都是数字 define merge numbers lst let 1st number gt string first lst 2
  • 在 Clojure 中递归反转序列

    我想在 Clojure 中反转序列而不使用reverse函数 并递归地执行此操作 这是我想出的 defn reverse recursively coll loop r rest coll acc conj first coll if co
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • emacs 启动后更改 X11 窗口标题

    当我启动 emacs 时 我可以使用 title 选项来控制保存 emacs 应用程序的 x 窗口的标题 emacs从elisp启动后可以更改标题吗 M x set frame name NewName RET 和来自 elisp set
  • 为什么这个 Clojure 减速器 r/fold 没有提供任何性能优势?

    我想知道为什么下面的代码在 r fold 的情况下没有提供加速 我对减速器有什么误解吗 我在一个相当慢的 尽管有 2 个核心 Ubuntu 12 04 开发盒上运行它 通过 emacs 和 lein 运行 每个都有相同的结果 require
  • 为什么 clojure future 会阻塞主线程?

    我有一个简单的 lein 项目 其中 main包含一个未来 def f future 42 defn main args println f 当我跑步时lein run它打印42但不返回 我不明白为什么它不返回 如何得到lein run回来
  • 用于正则表达式匹配及其在字符串中的位置的紧凑 Clojure 代码

    斯图尔特 哈洛威举了个例子 re seq w The quick brown fox 作为在 Clojure 中查找正则表达式匹配项的自然方法 在他的书中 这种构造与匹配器上的迭代进行了对比 如果人们关心的只是一份比赛列表 那就太好了 但是
  • Clojure / Noir:强制 HTTPS,如果请求是 http:// 则重定向到 https://

    我正在尝试在我的网站上强制使用 SSL 我想要一个环形中间件 将网站重定向到与 https 相同的 URL 如果它只是 http 我编写了以下代码 但除了检查请求方案并打印它应该重定向到的 URL 之外 它实际上没有做任何事情 defn h
  • 使用 ProGuard 混淆 clojure uberjar

    我想知道是否有人有使用 proguard 混淆他们的 leiningen 编译的 uberjar 的经验 我已经尽力在谷歌上寻找解决方案 但找不到真正的答案 我想知道这是否可能 我一直在尝试混淆默认的 lein 项目 这是 core clj
  • 这两个 clojure 函数之间有什么区别和问题?

    对于课程项目的一部分 我正在实现一个函数来从文件中读取一些数据并根据该文件创建图形结构 一整天我问了几个问题 结果就是这样 下面是一个可以正常工作的函数 它首先以惰性序列的形式读入文件 然后循环解析每一行并将其打印出来 defn print
  • 为什么 LISP 中符号名称中的连字符是约定俗成的?

    这个推荐的理由是什么 为什么不与使用下划线的其他编程语言保持一致 我认为 LISP 使用连字符有两个原因 历史 和 因为你可以 History LISP 是一种古老的语言 在早期输入下划线可能会很困难 例如 我用于 LISP 的第一个终端是
  • Emacs:当光标位于右括号时匹配括号

    之前有人问过 Emacs 当光标位于其上时突出显示匹配的括号 而不是其后 https stackoverflow com questions 16399530 emacs highlight matching paren when curs
  • 是否有一个 clojure 函数可以“连接”两个地图列表?

    我正在寻找一个类似于sql中的join的连接函数 例如 这是两个地图列表 def a user id 1 name user 1 user id 2 name user 2 def b user id 2 email e 2 user id
  • 在 Clojure 中退出 Recur 循环

    我想跳出下面的循环 并在第 10 行计算结果为 true 时返回最佳最小移动 我查看了 print 语句的输出 当第 10 行的计算结果为 true 时 它 找到了我正在查找的数据 但仍然重复出现 在 Clojure 中 有没有办法在语句计
  • Emacs-Lisp:如何将emacs-lisp程序打包为PC应用程序?

    只是想知道是否可以将 emacs 和 Lisp 程序打包和部署为 PC 应用程序 这样一旦下载并运行 setup exe 某种程度 用户就可以启动应用程序以使 emacs 运行特定的 Lisp 程序 就像应用程序已实现一样通过其他语言和平台
  • 方案如何返回多个值?

    我注意到几乎所有方案函数只能返回一个列表作为输出 下面 我想返回邻居的所有相邻节点的多个值 define neighbors l w if and 1 l 1 w list and l 1 w and 1 l w how to output
  • 评估 Common Lisp 宏的参数

    我想制作一个宏 其行为取决于它的参数之一 例如 defclass myvar l initarg l reader l defparameter mv1 make instance myvar l 10 defmacro mac1 v pr
  • 无法删除 IntelliJ/Cursive 中的括号

    我正在使用 IntelliJ Cursive 编写 Clojure 我发现 删除括号的唯一方法就是将其中的内容完全删除 然后才能将括号删除 例如 假设我有以下代码 list 我只想删除左括号 一旦我在左括号上按退格键 IDE 就会忽略此行为

随机推荐

  • 如何在vb.net中查看设计器代码

    我想看看设计师代码 我想看看如何使用或扩展表单生成 myForm 我的意思是在 C 中我可以看到 Designer cs 文件中的代码 但在 vb net 中我看不到 在 VB Net 中 为了查看设计器文件 您必须单击解决方案资源管理器上
  • 报告本地时间而不是 UTC 服务器时间

    我创建了一个页面 其中向用户显示服务器报告的天气数据 时间保存为 UTC 如何从 Blazor 服务器应用程序显示本地用户或浏览器的时间 我遇到了类似的问题并创建了一个名为的库布拉佐尔时间 https github com dustout
  • List 和 IEnumerable 的区别

    在实现这个通用的同时归并排序 http en wikipedia org wiki Merge sort 作为一种代码卡塔 http en wikipedia org wiki Kata 28programming 29 我偶然发现了 IE
  • Shopify:错误:[API] 此操作需要商家批准 write_themes 范围

    我是 Shopify 新手 我正在尝试在本地设置 Shopify 主题套件 我已经创建了一个私人应用程序并设置了我的商店 但是在尝试使用主题套件访问商店时出现此错误 Errors API This action requires merch
  • Silverlight:强制画布失效或重新绘制自身?

    我有一个 Silverlight 应用程序 上面有一个 Canvas 在该画布上 我动态地 绘制 了一堆东西 但向画布添加了控件 我在画布区域之外有一个按钮可以清除内容 对象已被删除 成功 然而 Canvas 区域不会立即刷新 目前 画布本
  • Memcached 最佳实践 - 小对象和大量键还是大对象和少量键?

    I use memcached http www danga com memcached 存储复杂计算的整数结果 我有数百个可以缓存的整数对象 我应该将它们缓存在更复杂的对象中的单个键下 还是应该为对象使用数百个不同的键 我正在缓存的对象不
  • 如何使用 Angular2 将服务注入动态组件

    我有一个使用 DynamicComponentLoader 动态加载另一个组件的组件 然而 动态组件需要注入服务 但是 我不确定如何解决这个问题 我从 Angular io 文档中看到 DynamicComponentLoader 接受 R
  • JavaScript 中变音符号的标题大小写(非 ASCII)

    是否可以创建一个 JavaScript 函数 可以将字符串转换为标题大小写 但可以处理非 ASCII Unicode 字符 例如 使用以下字符 etc 例如 如果字符串是 anders ngstr m 则应将其转换为 Anders ngst
  • 耳机上听不到 SuperCollider 的声音

    我刚刚开始使用超级对撞机学习音频编程 当我播放声音时 我可以在扬声器上听到它 但在耳机上听不到 我在启动服务器时收到以下消息 启动 57110本地主机JackDriver 客户端名称是 SuperCollider SC AudioDrive
  • C#:如何打开 Windows 资源管理器窗口并选择多个文件

    在 Windows Media Player 的库中 您可以选择一个或多个音乐文件 然后 您可以右键单击并在上下文菜单中选择打开文件所在位置 这将为文件所在的每个目录打开一个 Windows 资源管理器窗口 并且将为您选择文件 假设我们的库
  • 尝试使用屏蔽输入对 LSTM Seq2Seq 执行推理时出现 CUDNN_STATUS_BAD_PARAM

    我正在使用 keras 层tensorflow 2 0建立一个简单的基于 LSTM 的 Seq2Seq 文本生成模型 versions我正在使用 Python 3 6 9 Tensorflow 2 0 0 CUDA 10 0 CUDNN 7
  • 如何通过jmx在运行时修改ThreadPoolTask​​Executor

    我在通过 JConsole 修改 MBean 属性时遇到问题 我有一个 Threading bean 它通过以下方式调用 public static void main String args throws Exception JMX ne
  • 尝试使用 localnotification 呈现其视图不在窗口层次结构中的 UIAlertController [重复]

    这个问题在这里已经有答案了 我试图在用户单击本地通知后呈现 AlertView AlertView 有取消或确定选项 extension ViewController UNUserNotificationCenterDelegate fun
  • 我对 Haskell 的重击感到困惑

    The wikibook https en wikibooks org wiki Haskell Laziness说 在这个表达中 let z length 1 5 reverse olleh in z是一声重击 但是这个堆栈溢出 http
  • 如何知道 MySQLnd 是否是活动驱动程序?

    也许这是一个显而易见的问题 但我想确定一下 我如何知道 MySQLnd 是否是活动驱动程序 我正在运行 PHP 5 3 和 MySQL 5 1 37 在 phpinfo 中列出了 mysqlnd 但仅此我无法确定我使用的是 MySQLnd
  • 构造函数中带有 const 的 & 符号

    有人可以告诉我为什么我们通常将 const 和 与在构造函数中传递的某些对象一起使用吗 Book Book const Date date 我在这里遇到的困惑是 通常在 some 函数中使用 符号 因为该值是通过引用传递的 并且函数中该变量
  • 使用ViewPager时如何处理ActionBarActivity Fragments中的AsyncTask?

    我正在使用 ActionBarActivity 创建 5 个选项卡 我使用 ViewPager 在 5 个选项卡之间滑动 使用了扩展 FragmentPagerAdapter 的SectionsPagerAdapter 每个选项卡都有一个片
  • Python 中导入所花费的时间

    我想知道内置模块和用户定义模块的导入需要多长时间 从Python3 7版本开始 新增 X importtime选项可用 要测量导入时间 只需使用该选项执行脚本即可 例如python X importtime my script py 以供参
  • 在 Swift 3 中格式化数字

    我想将数字格式设置为 123234234234 中的 123 234 234 234 取决于用户在文本字段中输入的内容 我不想管理货币 这与货币无关 而是用户必须输入一个数字 并且该数字的格式应该正确以便于阅读 不是用逗号 而是用点 我在整
  • 学习一种 Lisp 有助于学习另一种 Lisp 吗?

    学习不同的 Lisp 语言之间有协同作用吗 我目前正在学习 Emacs Lisp 因为它在我的日常 Emacs 使用中立即有用 但是我对所有 Lisp 都很着迷 所以也许有一天我会学习和使用其他语言 当我开始深入研究 Common Lisp