宏、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.lang.LazySeq@xxxxxx?

    我使用 leiningen REPL 定义了以下 3 个函数 defn rand int range floor ceiling floor rand int ceiling floor defn mutate index mutates
  • 内存数据存储中有 Clojure 吗?

    我主要在 Node 中编程 并且喜欢文档存储 但我想首先对客户端和服务器之间的数据调用进行原型设计 我用过lowdb https github com typicode lowdb and da base https github com
  • Lisp:使用语法糖访问递归哈希

    我正在尝试构建一个函数 或宏 来简化哈希表深处数据的获取和设置 也就是说 哈希中的哈希 哈希中的哈希等 我不认为我可以用宏来做到这一点 而且我不知道如何用 eval 来做到这一点 我希望能够执行以下操作 gethashdeep HEROES
  • 关于onlisp中的广义变量

    我不确定这里发生了什么 文中的宏观示例 基本上不知道如何使用get setf 方法 一个内置宏 也许是函数 具体来说 如果某些返回值是这样的情况呢 get setf 方法为零 例如 get setf 方法 x NIL NIL NEW 306
  • Common Lisp 反引号/反引号:如何使用?

    我在使用 Lisp 的反引号读取宏时遇到问题 每当我尝试编写一个似乎需要使用嵌入式反引号的宏时 例如 w x y 来自保罗 格雷厄姆的ANSI 通用 Lisp 第 399 页 我不知道如何以编译的方式编写代码 通常 我的代码会收到一整串错误
  • 如何在“THEN”中打印“IF”条件的源代码

    我想在 THEN 部分打印 IF 条件的 Scala 源代码 例子 IF 2 2 lt 5 THEN println I am in THEN because sourceCodeOfCondition 现在我们跳过THEN部分 问题是 如
  • 如果未定义则跳过函数调用

    我有一个由不同模块组成的程序 模块通过函数调用互连 例如 State Init 调用各个模块的 init 函数 应可以禁用模块 从编译中排除 最简单的方法是使用预处理器定义 但这会生成大量代码 IF MODULE XXX COMPILE r
  • Lisp:CHAR 既未声明也未绑定

    几天前我决定学习 通用 Lisp 我意识到这是一个相当新手的问题 对于至少有一点经验的人来说可能非常微不足道 所以基本上发生的事情是我加载 Emacs Slime 通过 Lisp in a Box 并编写我的程序 包括在下面 defun l
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以
  • 从外部 clojar 导入/使用资源

    我想做的是将一个大文件 MIDI 声音字体 打包到一个独立的 Maven repo clojar 中 然后能够以编程方式将其拉下来并从单独的项目中使用它 事实证明 这个看似简单的任务比我想象的要复杂 理想的情况是 如果有一种方法可以直接访问
  • 将嵌套映射分解为键值对

    我想将 Clojure 中的嵌套映射分解为一系列键值对 例如 我们有这张地图 a b c d e f g h i j 分解后的地图应如下所示 a b c d e f g h i j d e f g h e f g h i j 输出的顺序并不
  • 如何创建一个扩展为“(x+y*240)*2”这样的表达式的 GNU GAS 宏?

    我正在使用 GAS 为 ARM Linux 构建一个程序 但我想做一些宏以使我的开发更加智能 然后我想知道 我怎样才能为此做一个宏 x y 240 2 were x and y are int 将像这样使用 mov r0 MACRO SHO
  • Common Lisp:循环列表中连续对的最佳方法是什么?

    有时我需要循环遍历列表中的连续对 我现在的做法是 loop for x on lst while not null cdr x do something on car x and cadr x 我想知道是否有更好的 内置的方法来做到这一点
  • 使用命令行界面构建 Clojure 应用程序?

    我刚刚开始使用 Clojure 来自 Ruby 我想构建一个带有命令行界面的小型应用程序 如何处理 CL 的输入 输出 我注意到有一个 clojure contrib command line 但文档很少 http github com r
  • C++ 编译时类型注册技巧

    我有以下情况 假设我有一堆类型 函子 我想在编译期间注册 编译它们 最好是像 boost mpl vector 这样的东西 你知道有什么技巧可以做得很好吗 我的愿望是拥有实现函子类型和注册文件的 hpp 文件 其中宏将类型引入编译中 例如
  • Leiningen 在哪里安装 clojure 库?

    第一次运行lien 它会安装clojure 但是要安装吗 似乎并不在 图书馆 图书馆 lein clojure jar 和贡献 jar 在 Unix OS X 标题 上是否有固定位置 Leiningen使用maven 或者更准确地说 是实现
  • 一次性的 lisp 宏,我的实现正确吗?

    我正在尝试从 Peter Seibel 的书 Practical Common Lisp 中学习 Lisp 在第 8 章 宏 定义你自己的 http www gigamonkeys com book macros defining your
  • C - 可变参数宏,它扩展为每个参数的一组宏调用

    我想要一个接受多个函数指针的宏调用 并且每个函数指针由第二个宏调用 该宏是函数声明 我想要表单上的两个宏 define FUNCTION DEF func extern int func void define FUNCTION DEFS
  • 在 Clojure 中检测操作系统

    是否有与 Common Lisp 相当的东西 features 在Clojure中 这样你就可以检测操作系统和其他环境配置 或者我只是通过 Java API 来实现这一点 可能使用Java API 这很容易 没有必要重新发明轮子 user
  • Common Lisp 中的原子和 Clojure 中的原子有什么区别?

    下列page http clojure org atoms讨论原子在 Clojure 中的工作原理 它并没有详细说明 Clojure 和其他 lisp 方言中原子之间的差异 Common Lisp 中的原子和 Clojure 中的原子之间的

随机推荐

  • 优化 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 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以