问题标签 [lisp-macros]

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.

0 投票
2 回答
203 浏览

common-lisp - 在 Common Lisp 中以宏列表作为参数的宏

在 Common Lisp 中,如何定义一个“元宏”,它将宏列表(和其他参数)作为参数,并组合这些宏以生成所需的代码。

这个问题相当于编写一个“高阶宏”,它从其他宏的变量列表中定义一个宏。

提示问题的具体情况对我来说是一个 CLSQL 实验,我想从 CLSQL-testsuite 重新表达员工类

作为

在定义复杂的数据库模式时,手头有这种技术将有利于一致性和简洁性。

我将我需要的两个特征定义为

然而,我写的尝试def-view-class-with-traits被挫败了。

在用于归约的 lambda 中,trait代表宏,而我对 apply 的使用对 Lisp 没有任何意义——这是正确的!- 但希望将我的意图传达给其他程序员。

如何让以适当的方式def-view-class-with-traits处理宏列表?traits

0 投票
1 回答
75 浏览

clojure - 如何更惯用地编写这个 Clojure 宏?

我喜欢避免使用(var-get (resolve (symbol ... (str '~parem)))). 就像是thi.ng.color.core/(~color-name)

(我在一个非常小的个人项目中使用这个宏,我不在乎为这个用例创建一个宏是否真的很糟糕。虽然我想知道为什么它会在更大的项目中出现问题。)

0 投票
2 回答
125 浏览

clojure - 用宏解析中缀字符串

我正在尝试评估字符串中的中缀表达式。

一些用于评估我的代码的示例数据:

我希望将qual字符串转换为这种形式并由 clojure 评估:

我编写了以下宏来实现这一点:

和一个辅助函数:

(eval-qual qual data)为我提供了预期的结果

这是我编写的第一个宏,我仍在努力解决所有引用和取消引用的问题。

  1. 我想知道是否有更有效的方法来实现上述目标?(甚至根本不需要宏)

  2. 如何扩展宏以处理嵌套表达式。处理像((Location = "US") or (Priority > 2)). 任何指针将不胜感激。我目前正在尝试tree-seq解决这个问题。

  3. qual如果字符串无效,我怎样才能使它更健壮和更优雅。

我还编写了parse-qual宏的第二次迭代,如下所示:

macroexpand抛出以下内容:

我不知道如何调试它!

一些额外的信息:

macroexpandREPL 上的 parse-qual 给了我以下信息:

谢谢@Alan Thompson,我能够将其编写为如下函数,这也允许评估嵌套表达式。

0 投票
2 回答
174 浏览

clojure - Clojure 将字符串变量评估为符号,这种使用读取字符串可以吗?

我可以使用memfn创建一个调用 java 函数的 clojure 函数。

memfn要求函数名是符号。我想知道是否可以编写一个宏来调用名称以字符串形式提供的任意方法。也就是说,我希望能够调用以下内容:

我能想到的唯一方法是使用read-string.

编辑:使用 read-string 和 eval 的版本实际上按我想要的方式工作。

我是否缺少一个基本的宏构建工具来获取符号引用的字符串并将其转换为文字而不可能执行代码read-string

感谢您的任何想法!

0 投票
1 回答
102 浏览

lisp - 在 Common Lisp 中构建动态 COND 子句

我想知道是否可以从像(伪代码)这样​​的循环中动态构建 COND 子句:

LOOP 将从列表中构建子句并生成如下内容:

0 投票
1 回答
148 浏览

macros - 我的 lisp 宏在最新的诡计中停止工作

我有我在 2010 年编写的宏,它用于使用 Alists 管理 Common Lips 中的结构(这里是整个文件,包括函数https://jcubic.pl/struct.txt)。

它工作正常。我最近在 JavaScript 中为我的 LIPS更新了这个宏(它基于方案),当我调用它时,它正在返回false并且想知道这是否是它在 guile 中的工作方式。但事实证明它根本不起作用。它显示了这个错误:

编译表达式时:错误:语法错误:未知位置:在表达式上下文中定义,其中不允许定义,形式为 (define (make-point #{ g746}# #{ g747}#) (map cons (quote (x y) ) (列表 #{ g746}# #{ g747}#))

为什么我有这个错误以及如何修复它,所以它再次以诡计工作?我很久以前不记得我是如何测试这段代码的,但是使用加载函数打开 guile 或将代码复制粘贴到解释器中都会给出相同的错误。

我在 GNU/Linux 上使用 guile 2.0.14。

PS:我更喜欢使用 lisp 宏 IMO,它们优于奇怪的方案卫生宏。

0 投票
0 回答
104 浏览

macros - 如何在 LISP 中定义递归返回引用列表的函数

我的 lisp 解释器用 JavaScript 编写的宏有问题。问题出在这段代码中:

我使用以下代码调用此宏:

这应该扩展到几乎相同的代码:

此功能有效。我使用调用主函数的宏的扩展代码有问题,不知道 LIPS 在找到时应该如何表现:

内部代码,您尝试像这样处理它:

现在我的 lisp 工作,将 lambda 标记为数据(将数据标志设置为 true,这是防止从宏对某些代码进行递归评估的技巧)并且klist->object函数将 lambda 代码作为列表,而不是函数。

这应该如何在 Scheme 或 Common Lisp 中工作?应该klist->object获取函数对象(lambda 被评估)还是以 lambda 作为第一个符号的列表结构?如果是第二个,那么我应该如何编写函数和宏来评估 lambda,我应该使用 eval (对我来说有点骇客)。

抱歉不知道如何测试这个,有更多无错误的 LISP。

编辑:

我试图在诡计中应用来自@jkiiski 的提示(因为在我的 lisp 中它不起作用)

但出现错误:

错误:未绑定的变量::onclick

我找到了我的 lisp 的解决方案,这是代码:

因此,在我的代码中,我正在编写某种元宏,我正在编写 quasiquote 作为列表,它将得到评估,就像我在原始代码中使用的一样:

我正在使用alist->object新函数pair-map,所以我可以取消引用值并将键符号转换为字符串。

这是应该如何在方案中实施的吗?不确定我是否需要修复我的 lisp 或宏在那里正常工作。

0 投票
1 回答
158 浏览

macros - 在运行时处理内部变量和数据结构的 LISP 宏

我有用 JavaScript 编写的 LISP(https://jcubic.github.io/lips/带有在线演示,您可以在其中尝试)并且我有这样的宏:

在这段代码中,我使用这个:

我使用以下方法调用此宏:

为 pfs 的每个静态方法创建函数(这是来自 isomorphic-git 的 LightingFS,其中每个函数都返回一个承诺,就像来自节点的 fs)。

但它不适用于这样的事情:

因为lips.env 是全局环境。

所以我的问题是宏应该如何工作?他们是否应该只将输入数据作为符号处理,以便在评估 lisp 代码之前永远无法访问对象?

基于变量生成一堆函数的 LISP 宏应该是什么样子。例如,在方案中,如果我在变量中有 alist 并且想要为每个将返回值的键生成函数:

输入:

输出:

如果我使用,我可以编写会给出这样输出的宏(macro input)吗?还是唯一的选择是(macro ((foo . 10) (bar . 20)))

我可以接受通用方案或通用 LISP 答案,但请不要从方案中发布定义语法和卫生宏,我的 lisp 没有它们,也永远不会有。

问题似乎是我想在宏扩展时访问值,并且它需要在运行时具有该值。第二个问题eval在这种情况下是唯一的选择吗?

这适用于biwascheme

(在我的 lisp eval 中不像在 biwascheme 中那样工作,但这是另一个问题)。

但这不起作用,因为 x 不是全局的:

带有 eval 的宏是您通常会做的事情,还是应该避免使用它们?有没有其他方法可以基于运行时对象生成一堆函数。

0 投票
3 回答
193 浏览

macros - 在方案中定义全局闭包的标准方法是什么?

所以我想知道是否有标准的方式来编写这样的代码:

我知道:

但是如果我想定义多个函数,这将不起作用,我需要知道标准方法,这样我才能编写定义函数的宏。你可以在 let 中调用宏:

例如宏将创建函数列表:

是否有定义函数 add1..add3 的标准方法?在我正在测试的方案中,这些功能将在内部本地let,而在外部无法访问。

如果您显示宏代码,我只对带有define-macroand的 lisp 宏感兴趣quasiquote,请不要define-syntax,因为这主要用于我自己的 lisp(基于方案),我只有 lisp 宏。

如果方案不支持这样的事情,像 Common Lisp 这样的其他方言是否允许这样的事情?

0 投票
1 回答
194 浏览

javascript - 如何在 JavaScript 中自定义 LISP 中编写宏扩展

我有一个普遍的问题,我应该如何去创建正确的宏扩展函数或宏。

这是我在 LIPS 解释器中的宏定义(你可以在这里测试它https://jcubic.github.io/lips/

问题是这是虚拟宏扩展并忽略有关变量的错误,因此它无法评估宏准引用,因为它会抛出找不到变量的异常。所以我最终在我的扩展列表中得到了 quasiquote(注意:最新版本的代码甚至不尝试扩展 quasiquote,因为它被标记为不可扩展)。

编写宏扩展的方法是什么?使用宏扩展功能时,我应该扩展评估功能以使其工作不同吗?

我正在测试 biwascheme 如何创建这个函数,https: //www.biwascheme.org/但它也不能像我期望的那样工作:

它扩展:

我希望它扩展到:

我的 lisp 回报:

即使我设置quasiquote为可扩展,它也不会扩展准引号,因为它找不到名称,所以它会抛出被宏扩展忽略的异常。

任何代码甚至伪代码都将有助于在我的 LISP 中编写此函数或宏。

编辑

我已经开始更新我的代码以将宏扩展合并到评估函数中,并在定义宏宏中进行了一项更改。调用宏扩展时,它不是第一次调用代码,这就是问题所在。:

前:

后:

现在它可以正常工作了,所以我的 expand_macro 宏工作正常,这就是你应该如何编写 macro_expand。

EDIT2:我进一步重构了代码,事实证明我不需要在define-macro宏中使用macro_exapnd代码,只需取消引用该对(删除数据标志)。