2

除了 GIMP 的 script-fu 之外,我从未使用过任何其他实现,而且我什至对 GIMP 的 Scheme 也很陌生。所以,也许我错了。但是,以下在 Script-Fu 控制台中不起作用:

(define x 13)
(define s 'x) ; or (define s `x)
,s => Error: eval: unbound variable: unquote 

相似地

(unquote s) => Error: eval: unbound variable: unquote 

在我看来,“,”是计划工作的,但 unquote 尚未实施。如果是这样,我该如何解决以下问题?

(define x 13)
(define y 7)
; define procedure to swap x and y
(define (swap) 
  (let ((t 0))
    (set! t ,'x)
    (set! x ,'y)
    (set! y t)
  )
)

这应该运行多次,所以(set!tx)...将不起作用。

4

1 回答 1

0

您的swap功能将作为:

(define (swap)
  (let ((t 0))
    (set! t x)
    (set! x y)
    (set! y t)))

因为set!是一个专门评估其参数的语法关键字。第一个参数(t在上面的第一个set!表达式中swap)不被评估;相反,它用于识别位置。第二个参数 ( x) 被评估,在这种情况下,返回标识符 ( x) 引用的位置中保存的值。

语法关键字的define工作方式类似。不评估第一个参数;它用于创建新位置;第二个参数被评估。因此,对于您的示例,unquote不需要只使用:

(define s x)

如果您试图定义s它返回的当前值,而不是分配时x绑定的值,则创建一个函数:xss

(define (s) x)

然后表达式(s)将返回x当前绑定的任何内容。

于 2013-10-07T14:39:50.943 回答