tinyscheme マクロを作成して、GIMP で 4 つのほぼ同一の手順を定義しようとしています。
(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の「手順」がバインドされません。プロシージャが登録され、メニューに表示されますが、使用しようとすると、この「unbound variable script-fu-move-layer-down」エラーが発生します。
アイデア?define
が最初の引数を評価しない方法に関連していると思いますが、それ以外の場合は失われます。tinyscheme マクロに慣れていない場合は、こちらのページを参照してください。