宏、Clojure 与 Common Lisp

2024-05-02

我和我的一些朋友正在开发一个新平台,我们想用 lisp 构建它。主要吸引力是宏。我们都使用 Common Lisp,但我想探索 Clojure 的选择。

当我提出这一点时,其中一位说宏观体系“较弱”。我想知道这是否属实,以及在哪些领域。


就您可以使用它们执行的操作而言,它们几乎是相同的,即:

  • 它们在编译时执行
  • 他们可以执行任意转换和生成代码(利用同形性 http://en.wikipedia.org/wiki/HomoiconicityLisp 代码)
  • 它们适合用新的语言结构或 DSL 来“扩展语言”
  • 你感觉自己非常强大,而且工作效率很高(在击败平均水平 http://www.paulgraham.com/avg.html way)

现在来看一些差异:

Common Lisp 还允许阅读器宏它允许您改变读者的行为。这允许您引入全新的语法(例如数据结构文字)。这可能是您的朋友将 Clojure 的宏系统描述为“较弱”的原因,因为 Clojure 不允许读取器宏。在 Clojure 中,你基本上会被语法所困扰(macro-name ....)但除此之外你可以做任何你想做的事。关于阅读器宏是否是一件好事,人们的观点存在分歧:我个人的观点不是,因为它不会给你任何额外的“力量”,并且有可能引起极度的混乱。

在我看来,Clojure 有一个命名空间的更好实现我认为这使得 Clojure 的宏系统更容易使用。 Clojure 中的每个符号都是命名空间限定的,因此不同的库可以在自己的命名空间中定义不同的相同符号。所以+可以单独定义为clojure.core/+ and my.vector.library/+没有任何冲突的风险。在您自己的命名空间中,您可以use http://clojuredocs.org/clojure_core/clojure.core/use来自另一个命名空间的定义,这意味着您可以选择采用+从任一clojure.core or my.vector.library如所须。

另一方面,Clojure 有额外的文字用于地图{}和向量[]。与传统的 Lisp s 表达式相比,它们为您提供了更多的表达能力(在简洁可读语法的意义上)。特别是,使用 [] 来绑定表单是 Clojure 中的一种约定,我认为它对于宏和普通代码都适用 - 它使它们从其他括号中清晰地脱颖而出。

Clojure 也是一个Lisp-1(像Scheme)所以它没有单独的函数和数据命名空间。 Common Lisp 是一个Lisp-2它具有单独的函数和数据命名空间(因此您可以同时拥有名为 foo 的函数和名为 foo 的数据项)。我稍微喜欢 Lisp-1 方法,因为它更简单,并且当您使用函数式语言编写时,代码和数据之间的划分似乎有点随意。不过,这可能是个人品味的问题。

总体而言,差异相对较小。我认为 Clojure 更简单、更优雅,而 Common Lisp 有一些额外的功能(使用风险自负!)。两者都非常有能力,所以选择任何一个都不会出错。

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

宏、Clojure 与 Common Lisp 的相关文章

  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • 为什么 clojure future 会阻塞主线程?

    我有一个简单的 lein 项目 其中 main包含一个未来 def f future 42 defn main args println f 当我跑步时lein run它打印42但不返回 我不明白为什么它不返回 如何得到lein run回来
  • Common Lisp——为什么这个符号不是外部的?

    我正在尝试在 ASDF 中运行测试 如下所示 foo asd defsystem foo tests depends on foo fiveam components module tests components file main pe
  • 我从 clojure 和 python 中得到的 hmac 签名略有不同

    我从 python 实现和 clojure 实现中获得的 HMAC SHA1 签名略有不同 我很困惑什么会导致这种情况 Python实现 import hashlib import hmac print hmac new my key my
  • 这两个 clojure 函数之间有什么区别和问题?

    对于课程项目的一部分 我正在实现一个函数来从文件中读取一些数据并根据该文件创建图形结构 一整天我问了几个问题 结果就是这样 下面是一个可以正常工作的函数 它首先以惰性序列的形式读入文件 然后循环解析每一行并将其打印出来 defn print
  • Jupyter (iPython) 笔记本中的 Latex 宏未由 github 渲染

    我的 Jupyter 笔记本 ipynb 中有一个 Markdown 单元 其中包含以下内容 newcommand paren 1 left 1 right paren beta 2 该文件位于 Github 存储库中 LaTex 宏应用程
  • Clojure Web 应用程序 - 我从哪里开始?

    最近我一直在研究 Clojure 我喜欢这门语言 我想看看我是否可以在其中制作一个小型网络应用程序 只是为了挑战自己 但是 我完全没有设置任何与 Java 相关的 Web 应用程序的经验 事实上 我对 Java 并没有太多的经验 我从哪说起
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • Leiningen 在构建可用的 uberjar 时遇到问题

    我们正在尝试与 Leiningen 一起构建我们的 Clojure 项目 我们通过执行以下操作成功创建了 uberjar 前提条件 project clj 文件列出了依赖项 main my project core在项目 clj中 core
  • 为什么 Clojure MySQL 查询结果中出现“M”

    我有一个返回一行的 Clojure 查询 下面是返回行 映射 的部分打印输出 employer percent 0 00M premium 621 44M 这两列在mysql表中分别是decimal 5 2 和decimal 7 2 为什么
  • Clojure:让作用域和函数返回值

    我在弄清楚如何使用 let 形式时遇到了一些麻烦 在下面的示例中 我想在本地绑定值 cols 以便稍后在函数中处理它 然而 我注意到 如果我使用 let 函数 sel opt tmp 将返回 nil 值而不是列表 defn sel opt
  • 如何在 VS Code 宏中将焦点返回到编辑器,将 Python 文本发送到调试控制台?

    我尝试按键绑定宏以将 python 文本发送到调试控制台并将焦点返回到 Visual Studio Code 中的编辑器 这是我尝试过的 安装了vscode python https marketplace visualstudio com
  • 使用 CounterClockwise 和 Eclipse 在 Clojure REPL 中进行评估

    我通常使用 Emacs 但受到启发再次尝试 CCW Eclipse 我有一个 Clojure 测试项目 其源文件 src user clj 包含以下内容 ns user println hi 我有一个 REPL 我从 Window gt S
  • Clojure 宏expand

    Why does macroexpand arm getHand getFinger 扩展到 arm getHand getFinger while macroexpand gt arm getHand getFinger 扩展到 getF
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 在 scala 宏中使用 LabelDef (2.10)

    我正在尝试 scala 2 10 宏功能 我使用时遇到问题LabelDef但在某些情况下 在某种程度上 我偷看了编译器的代码 阅读了摘录米格尔 加西亚的论文 http lampwww epfl ch magarcia但我还是卡住了 如果我的
  • 实现只有一个居民的类型的价值

    感谢 MilesSabin 的answer https stackoverflow com a 32157259 867671我可以编写类型级别的斐波那契序列 sealed trait Digit case object Zero exte
  • 试图理解 setf + aref “魔法”

    我现在已经了解了数组和aref在 Lisp 中 到目前为止 它很容易掌握 而且它的作用就像一个魅力 defparameter foo make array 5 aref foo 0 gt nil setf aref foo 0 23 are
  • 是否可以在 C 中自动生成的变量名中使用 __LINE__ ?

    为了避免重复 我想使用 LINE 在自动生成的变量名称中 define ROUTE path impl char k impl LINE route path impl 但它始终被视为普通字符串 LINE 即使我将其定义如下 我也无法得到我
  • 什么是 fn* 以及 Clojure 如何引导?

    The Clojure core 的来源 https github com clojure clojure blob master src clj clojure core clj似乎假设预先存在fn 这是在哪里定义的 引导程序还需要什么

随机推荐

  • 优化 itoa 功能

    我正在考虑如何使用SSE指令实现整数 4字节 无符号 到字符串的转换 通常的例程是将数字相除并将其存储在局部变量中 然后反转字符串 本示例中缺少反转例程 char convert unsigned int num int base stat
  • 当第一个套接字连接时加载两个图像而不是一个 - Node.js

    我正在尝试在我的游戏中实现多人游戏功能 我在用着node js为了这 当一个人连接时 应该将一张图像加载到浏览器中 相反 它加载两个图像 这是我班级的一部分 var count 0 Keep track of which player we
  • 如何使用elasticsearch进行分页?来自 vs 滚动 API

    我使用elasticsearch作为数据库来存储大量日志数据 我知道有两种方法可以进行分页 使用大小并来自 API 使用滚动API 现在我使用 from 进行分页 从前端和后端获取页面和大小参数 Java searchSourceBuild
  • 是否有可能比 O(n log n) 更好地计算数字列表的中位数?

    我知道可以在 O n 中计算数字列表的平均值 但是中位数呢 有没有比排序 O n log n 和查找中间元素 或者如果列表中有偶数个项目则两个中间元素的平均值 更好的算法 是的 您可以在 O n 时间内 确定性地 完成此操作 http ww
  • 当文件太大时,Flask 会重置连接而不是返回 413

    When MAX CONTENT LENGTH已定义 Flask 应该返回 413 但在我的例子中 它会重置连接并显示以下错误 Error 101 net ERR CONNECTION RESET The connection was re
  • 如何在 PHP 中解析和处理 HTML/XML?

    如何解析 HTML XML 并从中提取信息 Answer recommended by PHP collectives php Collective 原生 XML 扩展 我更喜欢使用其中之一原生 XML 扩展 https php net m
  • Bootstrap 如何从一个类切换到下一个类?

    我试图理解Bootstrap 3的反应能力 我明白在css如果一个元素有 2 个类 那么第二个类将覆盖第一个类 但是 当您使用以下命令创建响应式设计时Bootstrap 您的元素将如下所示 div class col sm 1 col md
  • 将 JSON 对象转换为 protobuf IStruct

    我正在使用Nodejs 的 Dialogflow API https cloud google com nodejs docs reference dialogflow 0 8 x google cloud dialogflow v2 这个
  • 双向消息传递的节俭

    我很好奇 Thrift 是否适合我的用例 我正在制作另一个消息系统 其中有客户端和服务器 但客户端和服务器都向对方发起请求消息 并且并非所有消息都可能是请求 而只是通知 回到 10 年前 我使用手动二进制编解码器完成了这项工作 回到 5 年
  • 谷歌 Android 地图 v2 MetersToEquatorPixel

    我目前的任务是将 Google Android 地图 v1 应用程序转换为 Google Android 地图 V2 应用程序 这个过程并不愉快 感谢谷歌 我的问题是 在之前的应用程序中 他们使用了 Google Android Maps
  • 有没有办法覆盖 iOS 13 上下文菜单的(深色/浅色)用户界面风格?

    我的应用程序支持 iOS 13 深色模式 并为用户提供匹配系统外观或强制应用程序始终使用深色模式或浅色模式的选项 无论系统设置如何 该应用程序还允许在用户按下时显示上下文菜单UILabel 但是 当使用以下方式呈现上下文菜单时UIConte
  • DOJO xhrGet如何使用返回的json对象?

    如何在 get 本身之外访问从 xhrGet 返回的数据 Firebug 显示 json 对象有一个名为 results 的数组 该数组存储响应中的 json 对象 但当我尝试访问它时它为 null 那么 如何访问最后一个代码行接收到的数据
  • Java ArrayList 复制

    我有一个ArrayList l1大小为 10 我指定l1到新列表引用类型l2 Will l1 and l2指向相同ArrayList目的 或者是副本ArrayList对象分配给l2 当使用l2参考 如果我更新列表对象 它会反映l1参考类型也
  • 从 Jinja 渲染模板中删除不必要的空白

    我在用着curl观看我的网络应用程序的输出 当 Flask 和 Jinja 渲染模板时 输出中存在大量不必要的空白 它似乎是通过渲染 Flask WTF 和 Flask Bootstrap 的各种组件来添加的 我可以使用剥离这个sed 但是
  • protoc 在哪里以及如何安装它?

    我想使用protoc生成java文件的命令 我一直按照 github README 中的说明进行操作https github com protocolbuffers protobuf https github com protocolbuf
  • 如何检查目录或其任何子目录中是否存在特定文件

    在 C 中 如何检查目录或其任何子目录中是否存在特定文件 系统 IO 文件 存在似乎只接受单个参数 没有搜索子目录的重载 我可以用 LINQ 来做到这一点系统 IO 目录 GetFiles使用搜索选项 AllDirectories超载 但这
  • 按键时从文本区域获取最后一行

    我有一个文本区域字段 在每次按键时 我想将文本区域中的最后一行推送到数组中 目前 我正在每次按键时构建数组以获取文本区域中的最后一行 有没有办法优化这个 意思是 无需构造数组即可获取文本区域中的最后一行 jQuery mytextarea
  • 为 python 游戏添加再次玩选项

    我正在使用 python 为我的编程课制作一个游戏 我不知道当玩家输了或退出游戏时如何再次给他们选择 我正在使用Python 2 7 这是我的游戏的代码 import pygame sys time random from pygame l
  • Eclipse 中的一个文件中可以有多个类吗?

    Eclipse 中的一个 java 文件中是否可以包含多个类 或者我真的必须将每个文件放在不同的文件中吗 这只是 Eclipse 强加的东西 还是 Java 编译器有一些反对将所有内容放在同一个文件中的东西 根据 Java 规范 每个文件只
  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以