我们希望使用IronScheme从C#调用一个方案,但是我们不断得到一个例外,说#34;不是一对"。
我们想调用以下Scheme代码:
(define (create-robot name)
(let* (
(position (cons 0 0))
(move-forward(lambda (x)
(set! position (cons (car position) (+ x (cdr position))))
position))
)
(list name (cons 'position position) (cons 'move-forward move-forward))));return attribute 'name' and procedure 'move-north'
(define (get-from-robot r name)
(cdr (assq name (cdr r))))
在C#中使用以下代码:
Callable c1 = schemeInterpretor.getCallable("create-robot");
Cons john = (Cons)c1.Call("john");
Callable getFromRobot = schemeInterpretor.getCallable("get-from-robot");
getFromRobot.Call(john , "'position");
我们得到以下例外:
{"not a pair"} {&assertion
&who: "cdr"
&message: "not a pair"
&irritants: (#f)
}
导致问题的原因是什么?我们怎么解决呢?
答案 0 :(得分:1)
您传递的是string
"'position"
,这是我所看不到的。使用SymbolTable.StringToObject("position")
(需要对象,因为如果您将其暴露为值类型,则会出现装箱问题。)
您收到错误是因为(assq name (cdr r)) => #f
并且您正在尝试将cdr
应用于此。