【发布时间】:2016-08-30 10:20:53
【问题描述】:
我有以下课程可以正常工作:
(define myob%
(class object%
(super-new)
(init-field val)
(define/public (getval) val)
(define/public (setval v) (set! val v)) ))
(define ob1 (make-object myob% 5))
(send ob1 getval)
(send ob1 setval 10)
(send ob1 getval)
输出:
5
10
下面的正则表达式也很好用:
(define sl (regexp-match #px"^(.+)[.]([^.]+)$" "ob1.getval"))
sl
输出:
'("ob1.getval" "ob1" "getval")
我正在尝试制作一个 fn foo,它应该像“发送”一样工作,但以 (foo ob1.getval) 或 (foo ob1.setval 10) 的形式接受参数。以下宏不起作用:
(define-syntax foo
(syntax-rules ()
((_ sstr ...)
(define sl (regexp-match #px"^(.+)[.]([^.]+)$"
(symbol->string sstr)))
(send (string->symbol(list-ref sl 1))
(string->symbol(list-ref sl 2))
...))))
(foo ob1.getval)
错误是:
syntax-rules: bad syntax in: (syntax-rules () ((_ sstr ...) (define sl (regexp-match #px"^(.+)[.]([^.]+)$" (symbol->string sstr))) (send (list-ref sl 1) (list-ref sl 2) ...)))
错误在哪里,如何纠正?
【问题讨论】:
-
AFAIK,
sstr表示语法对象,而不是符号,需要用syntax->datum转换。 (send的问题正好相反。) -
你能用正确的代码把它作为答案吗?
-
不幸的是,解决这些问题还不够,我不确定正确的代码是什么。