【发布时间】:2014-08-20 21:06:22
【问题描述】:
我正在尝试编写一个 tinyscheme 宏来在 GIMP 中定义四个几乎相同的过程:
(macro (define-layer-moving-function body)
(let* (
(func-name (cadr body))
(direction (caddr body))
(x-off (cadddr body))
(y-off (cadddr (cdr body)))
)
`(begin
;(define (func-name img layer) ;binding doesn't happen
(define (,func-name img layer) ;variable is not a symbol
(begin
(gimp-layer-translate layer ,x-off ,y-off)
(gimp-displays-flush)))
(script-fu-register
(symbol->string ,func-name)
(string-append "Translate layer " ,direction)
(string-append "Moves current layer slightly " ,direction)
"mugwhump"
"Foobar License"
"August 2014"
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
)
(script-fu-menu-register (symbol->string ,func-name) "<Image>/Move Layer")
)))
(define-layer-moving-function 'script-fu-move-layer-down "down" 0 10)
(define-layer-moving-function 'script-fu-move-layer-up "up" 0 -10)
(define-layer-moving-function 'script-fu-move-layer-left "left" -10 0)
(define-layer-moving-function 'script-fu-move-layer-right "right" 10 0)
问题出在这一行:(define (,func-name img layer)
特别是,func-name 位。当我取消引用 ,func-name 时,我收到错误“变量不是符号”。但我很确定,func-name 是 一个符号,因为(symbol->string ,func-name) 工作正常。
如果我不取消对func-name 的引用,gimp“过程”不会被绑定,大概是因为函数没有使用正确的名称定义。该程序已注册并显示在菜单中,但当我尝试使用它时,我收到此“未绑定变量脚本-fu-move-layer-down”错误。
想法?我猜这与define 如何不评估它的第一个参数有关,但否则我会迷路。如果您不熟悉,这里是Page on tinyscheme macros。
【问题讨论】:
标签: macros scheme gimp script-fu