首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使readmacros Lisp代码适应通用lisp

使readmacros Lisp代码适应通用lisp
EN

Stack Overflow用户
提问于 2020-05-29 18:55:50
回答 1查看 38关注 0票数 1

我正在尝试为pattern mather创建与这个UCI Lisp/Interlisp帮助函数等效的通用lisp。

代码语言:javascript
复制
(DRM /? (LAMBDA () (LIST '*VAR* (READ]

文档如下所示:

代码语言:javascript
复制
-Variables, which are used by the pattern matcher, start with a question mark ("?"), as in ?FOO.
-This is converted internally to (*VAR* role-name), so ?FOO becomes (*VAR* FOO).
-The DRM defines ? to convert itself to *VAR* when it is read

这是我目前的实现:

代码语言:javascript
复制
(set-macro-character #\? (lambda () (list '*var* (read))))

但是当我运行下面的匹配函数时:

代码语言:javascript
复制
(match (ptrans (actor ?x) (object ?x) (to (store)))
   (ptrans (actor (person)) (object (person)) (to (store))) nil)

我得到以下来自DRM函数的错误:

代码语言:javascript
复制
*** - EVAL/APPLY: too many arguments given to :LAMBDA

我的实现是正确的吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-30 15:51:23

Reader宏函数需要有两个参数:一个用于它们可以从中读取源代码的流,另一个用于触发它们被调用的字符。如果将您的实现更改为

代码语言:javascript
复制
(set-macro-character #\? (lambda (stream char)
                           (declare (ignore char))
                           (list '*var* (read stream))))

则任何出现的?x都将被读取为(*VAR* X)。请注意,如果用作函数参数,则会对其求值,如果VAR不是绑定的函数/宏,则会导致错误。

您可能希望将?x读入为'(*VAR* X) (请注意引号),以获得数据形式的列表。在这种情况下,您应该这样做:

代码语言:javascript
复制
(set-macro-character #\? (lambda (stream char)
                           (declare (ignore char))
                           (list 'quote
                                 (list '*var* (read stream)))))

为了防止对读取器宏函数返回的表单进行求值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62084315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档