【问题标题】:Gimp-Fu/Tinyscheme: unquoting symbols in function-defining macroGimp-Fu/Tinyscheme:在函数定义宏中取消引用符号
【发布时间】: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-&gt;string ,func-name) 工作正常。

如果我不取消对func-name 的引用,gimp“过程”不会被绑定,大概是因为函数没有使用正确的名称定义。该程序已注册并显示在菜单中,但当我尝试使用它时,我收到此“未绑定变量脚本-fu-move-layer-down”错误。

想法?我猜这与define 如何不评估它的第一个参数有关,但否则我会迷路。如果您不熟悉,这里是Page on tinyscheme macros

【问题讨论】:

    标签: macros scheme gimp script-fu


    【解决方案1】:

    宏不评估它的参数,因此func-name 绑定到(quote script-fu-move-layer-down)(或简称'script-fu-move-layer-down),这确实不是一个符号,而是两个符号的列表。

    如果你这样称呼它,也许它会起作用?:

    (define-layer-moving-function script-fu-move-layer-down "down" 0 10)
    

    【讨论】:

    • 啊,是的,这行得通。不知道宏不评估其参数,谢谢。
    • @mugwhump 您不需要宏来制作不同的功能。在它被定义之前,你甚至可以register-fo.. 发生这种情况,它与返回过程的过程几乎相同......例如。 (define script-fu-move-layer-down (make-move-layer "script-fu-move-layer-down" "down" 0 10))
    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多