使用ironscheme调用闭包

时间:2015-05-14 10:03:10

标签: c# closures ironscheme

我们希望使用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)
}

导致问题的原因是什么?我们怎么解决呢?

1 个答案:

答案 0 :(得分:1)

您传递的是string "'position",这是我所看不到的。使用SymbolTable.StringToObject("position")(需要对象,因为如果您将其暴露为值类型,则会出现装箱问题。)

您收到错误是因为(assq name (cdr r)) => #f并且您正在尝试将cdr应用于此。