我正在尝试为pattern mather创建与这个UCI Lisp/Interlisp帮助函数等效的通用lisp。
(DRM /? (LAMBDA () (LIST '*VAR* (READ]文档如下所示:
-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这是我目前的实现:
(set-macro-character #\? (lambda () (list '*var* (read))))但是当我运行下面的匹配函数时:
(match (ptrans (actor ?x) (object ?x) (to (store)))
(ptrans (actor (person)) (object (person)) (to (store))) nil)我得到以下来自DRM函数的错误:
*** - EVAL/APPLY: too many arguments given to :LAMBDA我的实现是正确的吗?
发布于 2020-05-30 15:51:23
Reader宏函数需要有两个参数:一个用于它们可以从中读取源代码的流,另一个用于触发它们被调用的字符。如果将您的实现更改为
(set-macro-character #\? (lambda (stream char)
(declare (ignore char))
(list '*var* (read stream))))则任何出现的?x都将被读取为(*VAR* X)。请注意,如果用作函数参数,则会对其求值,如果VAR不是绑定的函数/宏,则会导致错误。
您可能希望将?x读入为'(*VAR* X) (请注意引号),以获得数据形式的列表。在这种情况下,您应该这样做:
(set-macro-character #\? (lambda (stream char)
(declare (ignore char))
(list 'quote
(list '*var* (read stream)))))为了防止对读取器宏函数返回的表单进行求值。
https://stackoverflow.com/questions/62084315
复制相似问题