问题标签 [reader-macro]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
common-lisp - 如何在 common-lisp 中将 *readtable* 设置为空?
标准的 common-lisp 定义了许多读取器宏,例如(
and)
用于分组,'
for quote
,"
用于字符串引用,|
用于符号引用,#
用于调度宏等。现在我想将它们全部禁用并使用我自己的,我必须调用set-macro-character
一个一个禁用它们,然后定义我自己的。
我发现有一种方法可以通过调用将所有阅读器宏恢复为标准宏(setf *readtable* (copy-readtable nil))
,但是有没有办法将它们设置为空(即,所有字符都被视为普通字母和数字)?
common-lisp - 如何强制 Common Lisp 将数字视为符号名称?
我希望这些代码
可以被视为三个符号
而不是三个数字。
我可以通过设置阅读器来实现这一点吗?
更新:
我有一组以嵌套列表形式组织的数据:
不同的项目用逗号或空格分隔(包括制表符和换行符)。我想在嵌套结构中阅读它们,并且不更改任何字符。逗号可以通过以下方式设置为空格:
最后,问题仍然存在于数字上。由读者21e4
转发。210000.0
我不想从头开始编写解析器,并尽量利用 common-lisp 的阅读器。
macros - 使用禁用的调度阅读器宏创建可读表
我正在创建一种基于 Racket 的新语言,并且我不希望某些#x
宏起作用,例如 syntax-quote #'
。如何删除它以便#'
不执行语法引用,而是执行未绑定调度宏字符的任何操作?
我可以通过做单字符宏来做到这一点
但我不知道如何为调度宏执行此操作。
lisp - 如何在阅读器宏中评估 Lisp 代码?
我正在用 Common Lisp 编写自己的 x86-64 汇编程序,它为 x86-64 的子集生成正确的二进制代码。我使用自定义阅读器宏将汇编代码转换为语法树,它按预期工作。
我试图完成的是允许在汇编代码中使用 Lisp 代码,这样我就可以将Lisp 用作我的汇编器的宏语言。我#a
用作宏调度字符并#e
为读者发出结束信号。内部阅读器#l
更改为 Lisp 模式并#a
返回到汇编模式,#e
(为阅读器宏发出信号结束)应该在两种模式下都可以工作。
我不明白的是如何将评估代码的结果输出回输入流(在其余代码之前处理),或者如何让 Lisp 代码输出被再次读取,以便输出可以适当地处理 Lisp 代码(它将是汇编代码)(与汇编代码的其余部分相同)。我怎样才能达到那个目标?
旁注:这是我的第一个阅读器宏,因此可能存在设计缺陷。我认为我将 Lisp 代码读入字符串的方法不一定是最好的方法,如果有一些更短和更惯用的方法来做到这一点。
这是我的阅读器宏的简化版本:
这是一些没有 Lisp 代码的示例汇编代码,可以工作:
这是一些内部带有 Lisp 代码的汇编代码,失败(请参阅下面的编译错误)。在这一点中,Lisp 代码在汇编代码之后,但应允许将汇编代码和 Lisp 代码自由混合,使用#a
和#l
作为分隔符。
上述代码的 Lisp 部分应在自定义阅读器中进行评估,以便它产生与以下代码相同的结果:
但是编译失败:
common-lisp - 在 Lisp 的 #[ 读取宏中引用的必要性?
我正在阅读 On Lisp,但无法弄清楚为什么下面的代码使用了引号。以下是文本的摘录:
为用户保留的另一个字符组合是#[。图 17.3 给出了一个例子,说明如何将这个字符定义为一种更精细的左括号。它定义了一个 #[xy] 形式的表达式,以将其读取为 x 和 y 之间所有整数的列表,包括:
图 17.3:定义分隔符的读取宏。
我不明白为什么do** 的结果表单中的行是 **(list 'quote (nreverse accum)))而不是 (nreverse accum)。因为我们可以毫无问题地运行下面不使用引号的代码,对吧?
有人知道这里的诀窍吗?
lisp - 使用 # aka read-macro
阅读 Doug Hoyte 的书“Let Over Lambda”,我发现了以下#.
符号描述,也就是 read-macro:
COMMON LISP 内置的基本读取宏是#。读取时评估宏。这个读取宏允许您将对象嵌入到您读取的无法序列化但可以使用一些 lisp 代码创建的表单中。
它来自第 4 章,本书的大部分内容可以在这里找到:http: //letoverlambda.com/index.cl/toc
这是书中的一个例子,它展示了相同的表达方式每次都可能以不同的方式阅读:
接下来,作者演示了一些核心技巧,使用#
宏创建变体。
所以,原来它#'
也是某种阅读宏,它通常用在表示函数名称的符号之前。但有必要吗?他在那里的工作到底是什么?
#'
我可以为带有或不带有它的高阶函数放置符号:
以同样的成功。
common-lisp - Sharpsign Colon 和 Gensym 之间的差异
我刚刚阅读了Sharpsign冒号阅读器宏,听起来它与gensym的效果非常相似
Sharpsign 冒号:“引入了一个不受约束的符号”
Gensym:“创建并返回一个新鲜的、无拘无束的符号”
所以一个简单的测试
很酷,所以它应该失败。
现在进行宏观测试
Sweet 所以它可以像 gensym 一样使用。
对我来说,这看起来比 gensym 更干净,结果明显相同。我确定我错过了一个重要的细节,所以我的问题是,它是什么?
common-lisp - 在 asdf defsystem 中选择 :file 组件的扩展名
我 90% 确定答案在asdf 文档的这一段中,但我似乎无法理解它。我想知道我是否能够将不以“.lisp”结尾的源文件作为文件组件。例如,通常我有类似的东西
如您所见 :file 组件没有指定扩展名。我想知道是否可以加载不以“.lisp”结尾的 lisp 文件。
我想要这个的原因有点奇怪,但对问题没有影响,所以请随意跳过下一点。
我有一些文件“test.mylang”,它以以下内容开头
这#!mylang
是一个阅读器宏,它让我的#'mylang 函数控制解析文件的其余部分。因此,如果我有一个 python 解析器,我会使用 #!python 并且我的 #'python 函数将负责解析。在这些情况下,我希望使用.mylang
or.py
扩展名,以便编辑器立即知道如何突出显示代码,即使它无论如何都会被加载为 lisp。
谢谢各位
lisp - Lisp 加载错误:调度宏中的未定义字符
我决定我的生日是尝试解决我的 Lisp 问题的好时机。
我从某人那里收到了一个 Lisp 程序来运行一个实验。它在他的 OS X 环境中运行良好。但是,我无法让它在 Windows 7 或 Ubuntu 上运行。该程序使用 Act-R 6.2 运行模型。当我尝试加载 .lisp 文件时,我收到以下错误:
Windows 7 和 Ubuntu 的错误完全相同。如果需要,这是控制台输出:
http://i.stack.imgur.com/dFXVm.png
似乎 load-turing-application.lisp 加载了多个其他文件,其中一个是 turing-application-v1.lisp,其中的行(setf *smile* (#/initWithContentsOfFile: (#/alloc ns:ns-image)(ccl::%make-nsstring "smiley.jpg")))
似乎是罪魁祸首。我怀疑它与 #/-notation 有关。
任何想法,将不胜感激。
clojure - 是否有正式的方式来提议/讨论对 Clojure 的更改?
是否有正式的方式来提议/讨论对 Clojure 的更改?