球拍宏不起作用
Racket macros not working
我从来没有使用过Racket的宏系统,所以请原谅我的无知。我正在尝试在 Racket 的 Datalog 系统中动态定义规则,基本上是这样的:
(datalog rules (! (:- c a b)))
如果我直接把这样的东西放到代码中,一切都很好。但是,我想动态生成这些规则。对于常规函数,我会做这样的事情:
(datalog rules (! (apply :- conclusion premises)))
但是datalog
、!
和:-
都是宏,这不可能。
我的解决方案是编写这个宏:
(define-syntax (make-rule stx)
(syntax-case stx ()
((_ premises conclusion)
#`(datalog rules (! (:- ,conclusion ,@(map (lambda (x) `,x) premises)))))))
然后这样调用:
(make-rule '(a b) 'c)
然而,虽然这样做 运行,但当 a
和 b
都为真时,查询 Datalog 数据库不会呈现任何内容。
我尝试用双引号引用语法对象,这样我就可以看到输出的是什么,它是这样的:
'(datalog rules (! (:- c a b)))
所以... 应该和确实工作,如果我直接在我的代码中输入它!这里发生了什么?这是某种卫生宏观的东西吗?我真的不知道。
谢谢!
编辑:这是一个完整的运行问题示例。
#lang racket
(require datalog)
(define rules (make-theory))
(define-syntax (make-rule stx)
(syntax-case stx ()
((_ premises conclusion)
#`(datalog rules (! (:- ,conclusion ,@(map (lambda (x) `,x) premises)))))))
(make-rule '(a b) 'c)
(datalog rules (? c)) ;;Does not work.
(datalog rules (! (:- c a b)))
(datalog rules (! a) (! b))
(datalog rules (? c)) ;;Works.
好的,我想我已经为你准备好了。这不是卫生问题。
#lang racket
(require datalog)
(define rules (make-theory))
(define-syntax (make-rule stx)
(syntax-case stx ()
((_ (ps ...) c)
#'(datalog rules (! (:- c ps ...))))))
(datalog rules (! a) (! b))
(make-rule (a b) c)
(datalog rules (? c))
问题出在 quoting/unquoting。在这里,我只是修改了模板以接受您提供的表格。同样,我并不是真正理解数据记录语言,但这提供了与您在示例中所说的相同的输出 "works"。
我从来没有使用过Racket的宏系统,所以请原谅我的无知。我正在尝试在 Racket 的 Datalog 系统中动态定义规则,基本上是这样的:
(datalog rules (! (:- c a b)))
如果我直接把这样的东西放到代码中,一切都很好。但是,我想动态生成这些规则。对于常规函数,我会做这样的事情:
(datalog rules (! (apply :- conclusion premises)))
但是datalog
、!
和:-
都是宏,这不可能。
我的解决方案是编写这个宏:
(define-syntax (make-rule stx)
(syntax-case stx ()
((_ premises conclusion)
#`(datalog rules (! (:- ,conclusion ,@(map (lambda (x) `,x) premises)))))))
然后这样调用:
(make-rule '(a b) 'c)
然而,虽然这样做 运行,但当 a
和 b
都为真时,查询 Datalog 数据库不会呈现任何内容。
我尝试用双引号引用语法对象,这样我就可以看到输出的是什么,它是这样的:
'(datalog rules (! (:- c a b)))
所以... 应该和确实工作,如果我直接在我的代码中输入它!这里发生了什么?这是某种卫生宏观的东西吗?我真的不知道。
谢谢!
编辑:这是一个完整的运行问题示例。
#lang racket
(require datalog)
(define rules (make-theory))
(define-syntax (make-rule stx)
(syntax-case stx ()
((_ premises conclusion)
#`(datalog rules (! (:- ,conclusion ,@(map (lambda (x) `,x) premises)))))))
(make-rule '(a b) 'c)
(datalog rules (? c)) ;;Does not work.
(datalog rules (! (:- c a b)))
(datalog rules (! a) (! b))
(datalog rules (? c)) ;;Works.
好的,我想我已经为你准备好了。这不是卫生问题。
#lang racket
(require datalog)
(define rules (make-theory))
(define-syntax (make-rule stx)
(syntax-case stx ()
((_ (ps ...) c)
#'(datalog rules (! (:- c ps ...))))))
(datalog rules (! a) (! b))
(make-rule (a b) c)
(datalog rules (? c))
问题出在 quoting/unquoting。在这里,我只是修改了模板以接受您提供的表格。同样,我并不是真正理解数据记录语言,但这提供了与您在示例中所说的相同的输出 "works"。