0

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 マクロに慣れていない場合は、こちらのページを参照してください。

4

1 に答える 1