阅读宏:你用它们做什么? [关闭]

2024-03-17

我正在尝试感受一下迄今为止我还没有使用过的 Lisp 部分。读取宏此刻引起了我的注意。关于他们的信息并不多use看看人们用它们做了什么,既可以获取它们如何工作的例子,也可以了解它们可以解决哪些类型的问题,这将有所帮助。接下来,是否有任何指南可以帮助您了解什么是读取宏的好用和坏用?


S 表达式是 Lisp 数据的 Lisp 语法。 S 表达式是用 READ 函数读取的,而读取宏是 Lisp 扩展读取器的内置方法。这意味着读取宏的最直接用途是实现预定义的数据语法,并为更改或扩展 Lisp 读取 s 表达式的方式提供了可能性。

Lisp 为许多数据类型提供了预定义的外部语法:符号、数字、字符串、数组、字符、conses、列表、结构等等。它允许打印和读回数据对象。

  1. Lisp 缺乏其他几种数据类型的语法——尤其是哈希表和 CLOS 对象。因此,在用户代码中读取宏的第一个用途是扩展读取器,使其能够读取数据结构,例如哈希表、并行向量、新数字类型……基本上开发人员希望有一个外部语法的每种数据类型可以回读。

  2. 由于 Lisp 也将 s 表达式用于代码,因此读取宏的第二个用途是扩展 Lisp 程序的表示法。一个典型的例子是使用[和]来编写嵌入式SQL代码。通常的 Lisp 语法看起来很相似,但 [ 和 ] 的使用有助于 SQL 表达式在代码中脱颖而出。另一个例子是使用读取宏为嵌入式编程语言提供标识符,例如 Objective C 常量、消息等。Clozure CL 使用它来表示区分大小写/保留大小写的标识符,并在读取时使用索引查找它们的定义外部可用的标识符。

  3. 第三个用途是将不同的语法嵌入到 Lisp 语法中。一个古老的例子是中缀读取宏,它允许嵌入中缀表达式。其他示例包括嵌入的 HTML 或 XML 语法,或其他编程语言语法的嵌入片段。

  4. 有时,读取宏用于实现其他(相关)语言,这些语言使用与预定义的 Common Lisp 语法不同的 s 表达式语法。一个例子是Scheme s-表达式的阅读器——它与Common Lisp 略有不同。

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

阅读宏:你用它们做什么? [关闭] 的相关文章

  • 如何使用双浮点?

    我正在努力弄清楚如何告诉 Lisp 我想使用双浮点值 假设我有 let x 1 format t A x 3 0 这使 0 33333334 如果我想使用双浮点数 我尝试了以下方法 let x 1 declare type double f
  • 使用 Javascript 的无层 Web 框架?

    Links http links lang org是一种类似 Lisp 的函数式 Web 编程语言 框架 可以轻松编写一段代码 并将其编译为服务器端代码 客户端 JS 和 HTML 从而使编写 Web 应用程序变得更加容易 由于客户端和服务
  • 为什么 eval 是邪恶的?

    我知道Lisp和Scheme程序员通常会这么说eval除非绝对必要 否则应避免 我已经看到了对几种编程语言的相同建议 但我还没有看到反对使用的明确论据列表eval 在哪里可以找到使用潜在问题的说明eval 例如 我知道以下问题GOTO在过程
  • 为什么函数 apply 会抱怨长列表?

    作为一些欧拉阵痛 http projecteuler net 我正在尝试编写一个埃拉托斯特尼筛法 https en wikipedia org wiki Sieve of Eratosthenes带有因式分解轮 到目前为止我的代码是 def
  • 如何创建像球拍一样的 make-curry 函数

    我想看看如何模仿 curry func that racket提供 下面是我如何手动柯里化函数的示例 lang sicp convert to a curried function define add1 x y x y define ad
  • 在 Common Lisp 中替换列表中的项目?

    我有一个事物列表 我称之为 L 一个索引 N 和一个新事物 NEW 如果我想用 NEW 替换 L 中 N 中的内容 最好的方法是什么 我是否应该获取到 N 的子列表以及从 N 到列表末尾的子列表 然后使用列表将第一部分 NEW 和最后一部分
  • Common Lisp 中的动态和词法变量

    我正在读 Peter Seibel 的 Practical Common Lisp 一书 在第 6 章 变量 部分中 词法变量和闭包 和 动态 又名特殊变量 http www gigamonkeys com book variables h
  • Lisp 中的函数名可以有别名吗?

    就像包裹一样 我使用Emacs 也许 它可以提供某种解决方案 例如 defun the very very long but good name 稍后在代码中没有用处 但名字就像Fn 15或者第一个字母缩写也没有用 是否可以使用类似于包的别
  • common lisp:宏如何使用以编程方式生成的名称定义其他方法/宏?

    我意识到我的代码的某个部分由看起来相似的方法组组成 就像我有多个三重奏 一个由程序员的其他两个函数调用的辅助函数 我正在尝试编写一个宏来为我定义这三个函数 以便我所需要做的就是调用该宏 但我的尝试导致 defun 和函数调用将引用字符串而不
  • 与 emacs/slime 的其他 Lisp/Scheme 实现等效的 'lein swank'

    我一直在使用 emacs slime 来编码 lisp 但是使用 Clojure 我发现了 lein swank 我必须说它非常有用 因为我可以连接到运行 clojure 的服务器 其他 Lisp 实现怎么样 哪些 Lisp 实现提供了与
  • Scheme/Racket有枚举操作吗?

    Scheme Racket 是否有相当于 Haskell 中的 a b 表示法的枚举表示法 在 Haskell 中 1 5 计算结果为列表 1 2 3 4 5 for list i in range 1 6 i sequence gt li
  • 以下函数式编程模式的正确术语是什么?

    我听说它被称为stream http mitpress mit edu sicp full text sicp book node72 html as an 无限列表 http en wikibooks org wiki Clojure P
  • Lisp 当前内存使用情况

    我需要从 Common Lisp 程序中找出当前使用了多少内存 我知道没有可移植的方法 标准函数room以文本形式将信息打印到标准输出 而不是将其作为值返回 但是sb kernel dynamic usage在 SBCL 工作 其他 Com
  • Common Lisp 中的(随机)不那么随机?

    好的 最后一个问题 我将用 Common Lisp 完成我的猜数游戏 D 每当游戏开始 或者在第一个游戏之后开始新游戏 时 都会调用以下函数 Play the game defun play If it s their first time
  • 在 Parenscript 中使用 regex(正则表达式)

    我正在尝试 Parenscript 在尝试使用正则表达式函数时 我得到了意外的输出 例如 参考手册 https common lisp net project parenscript reference html shows regex f
  • 在 Lisp 解释过程中,“读者”的任务是什么?

    我想知道 读者 在解释 编译 Lisp 程序期间的目的 或者更准确地说 是 读者 的任务 从我刚刚完成的问题前研究来看 在我看来 读者 特别是本例中的 Clojure 可以被视为 语法预处理器 它的主要职责是读取器宏和原始形式的扩展 所以
  • 如何定义和使用 Common Lisp 包(库)?

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • 人们可以放心地忽略宏和内置宏之间的区别吗?

    我从 Clojure 开始 这也是我的第一个 lisp 显然有很多东西需要吸收 为了减轻认知负担 我尝试找到我可以安全地忽略的部分 目前 人们能否安全地以相同的方式处理带有宏的表单和带有内置函数的表单 或者是否会出现以后出现的陷阱 换句话说

随机推荐

  • 用于 RSSI 距离近似的卡尔曼滤波器

    我目前正在开发一个项目 该项目利用 RSSI 信号来确定用户与三个信标之间的距离 虽然我有粗略的三角测量公式 但我正在努力使一些东西更加准确 通过我所有的研究 我发现了卡尔曼滤波器 从我读到的有关它们的内容来看 它们似乎正是我想要使用的 然
  • Android 手机通话流

    Android 是否可以在发送电话数据之前对其进行实时操作 例如 通过创建一个缓冲区来记录语音然后发送 或者它是否不可访问 并且必须始终是 实时 抱歉 没有 Android 应用程序不支持通过电话与音频流交互的方式
  • Javascript:更改复选框上的标签背景颜色

    我试图根据复选框的选中 未选中状态更改表单中每个复选框中标签的背景颜色 到目前为止 我最初更改了它 但当我取消选中时它不会变回来 http jsfiddle net 7wnCL 4 http jsfiddle net 7wnCL 4 jav
  • 同步和异步通信到底如何工作

    我试图理解术语同步和异步通信 但我有点困惑 我试着深入研究一下this https stackoverflow com questions 1596589 why are asynchronous processes not called
  • Java 脚本无法在 html 电子邮件模板中运行

    我有一个场景 我需要使用 c 发送电子邮件 这可以使用 SMTP 轻松完成 但挑战是将 Web 服务合并到 html 邮件中 因此我在邮件正文中使用了 java 脚本来访问 Web 服务发出按钮点击声 作为一个 html 网页 它工作得很好
  • 以编程方式更改过期的 Oracle 数据库密码?

    在我工作的地方 一些数据库会从生产环境复制到测试环境 但 DBA 在复制后立即将 新 测试数据库上的所有密码设置为过期 以便不知道生产密码 因此 如果我运行 sqlplus 并使用特定用户名连接到测试数据库 它会立即提示我输入新密码 有没有
  • 使用 RDCOMClient 通过 R 中的 Outlook 发送电子邮件附件

    我正在运行每日分析 生成一个我想通过我的 Outlook 电子邮件发送的文件 我使用的代码在这里 并且工作得很好 但它的附件部分从来没有工作过 library RDCOMClient OutApp lt COMCreate Outlook
  • 增加 Windows 上的堆栈大小 (GCC)

    有没有办法在使用 GCC 编译 链接时增加 Windows 应用程序的堆栈大小 IIRC 在 GCC 中 您可以向 ld 提供 stack bytes 参数 E g gcc Wl stack 16777216 o file exe file
  • Grails 外部配置。无法访问外部变量。总是[:]

    我无法让 文件夹 外部变量工作 我总是得到 我正在 Windows 下使用 Grails 进行开发 这就是为什么外部配置文件看起来像 file C path to file 我在另一个项目中使用外部配置没有问题 与下面显示的方式相同 我有这
  • 基于数组项获取集合给出“FAILED_PRECONDITION:查询需要索引”[重复]

    这个问题在这里已经有答案了 我试图获取所有具有 数学 标签的问题 但它没有成功 而是转移到失败的监听器 db collection questionCollection orderBy questionID Query Direction
  • 如何从 SQuirreL SQL 调用带有 OUT 参数的 DB2 存储过程?

    我真的很喜欢 SQuirreL SQL 作为 SQL 查询工具 但我一直无法让它调用我们的 AS 400 DB2 数据库中的存储过程 我总是收到错误 设置或注册的参数值的数量与参数的数量不匹配 我已经仔细检查了参数的数量 但没有运气 这是我
  • BufferedReader 在 read() 处阻塞

    我试图创建一个简单的聊天程序 带有 服务器 和客户端 现在我的问题是程序在从服务器读取消息到客户端时阻塞 反之亦然 此示例解决了从客户端到服务器的消息问题 我在服务器端的示例 private Reader input private Wri
  • 使用 tomcat7 maven 插件中的“运行”目标的 Eclipse maven 运行配置不尊重默认上下文路径

    我正在本地开发一个 Web 服务 使用 maven 构建并部署到 tomcat 我正在使用 Maven 插件在本地运行 使用mvn tomcat run作为我的运行配置 现在 我的服务正在使用默认项目名称作为上下文路径进行部署 http l
  • 如果我在脚本仍在执行文件 I/O 操作时突然关闭脚本,会发生什么情况?

    这是我的问题 我正在编写一个脚本来检查我的网站是否运行正常 基本思想是每隔 5 分钟左右获取服务器响应时间和类似的东西 并且脚本每次检查后都会记录信息服务器状态 我知道在检查 写入日志的过程中关闭脚本是没有好处的 但我很好奇如果有很多服务器
  • SQLite 错误:无法删除WhereListIterator`1:它没有 PK

    我尝试在 Visual Studio 2012 中使用 SQLite C 从数据库中删除记录 每当我尝试删除记录时 都会收到以下错误 SQLite 错误 无法删除WhereListIterator 1 它没有 PK 我想使用两种不同的方法删
  • 使用本地 Python 脚本启动本地 PHP 脚本

    我正在编写的 Python 程序需要在 Python 进程之外启动本地 PHP 脚本 该程序还需要将参数传递给 PHP 脚本 到目前为止 这似乎启动了脚本 os system path to script here param param
  • 将 POJO 保存到 Jackrabbit JCR 中的最佳方法是什么?

    在 Jackrabbit 中 我经历了两种将 POJO 保存到存储库节点中以存储在 Jackrabbit JCR 中的方法 写我自己的层 和 使用 Apache Graffito 事实证明 编写我自己的代码既耗时又费力 必须编写并运行大量丑
  • 计算圆中的每个笛卡尔点

    我有一个数组 int lawn new int 980 1280 它存储草坪中叶片的高度值 在我的模拟中 我有一个机器人在草坪上行走并切割刀片 我的机器人呈圆形 直径为 rDiameter 坐标系是用 Double 完成的 我的草坪是用 I
  • 如何使用主义2和zend框架2中的缓存?

    请我在这里需要一些帮助 我已经搜索了很多但没有结果 我如何利用查询及其存储在memcache中的结果 我正在使用zend框架2和学说2 这是我在 module config php 中的配置 Doctrine config doctrine
  • 阅读宏:你用它们做什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi