条件(cond ...)script-fu中的错误

时间:2013-11-24 11:56:24

标签: scheme lisp gimp script-fu

我正在尝试使用一个脚本fu并且我在理论上使用cond语句是正确的,但它总是给出错误“Error:(:1)非法函数”。

这是代码:

(define (script-fu-prueba 
        edicionInteractiva) 
    (let* 
        (
            (cond 
                ( (equal? edicionInteractiva "Interactivo") (edicionInteractiva RUN-INTERACTIVE) )
                ( (equal? edicionInteractiva "No interactivo") (edicionInteractiva RUN-NONINTERACTIVE) )
            )
        )
    )
)

(script-fu-register "script-fu-prueba" 
    "<Image>/Filters/PRUEBA"
    "Prueba"
    "Author"
    "Copyright"
    "Date"
    ""

    SF-OPTION   "Interactive" '("Interactivo" "No interactivo")
)

有什么错误?

我还想在肯定和否定的情况下制作一个包含多个陈述的条件陈述。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

首先,显示的代码不遵循良好的Lisp缩进约定。你不能在单独的行中括起括号,它们就像C语言中的花括号一样!此外,let*完全没必要,你不会在其中声明变量。你应该使用一个好的IDE或带有语法着色的文本编辑器来帮助你平衡括号,否则语法错误很难被捕获。

潜伏着一个更严重的问题。参数(看起来像是一个字符串)被称为edicionInteractiva,但这也是你要调用的函数的名称 - 它不起作用,它们必须具有不同的名称。我将参数重命名为modo。我相信你的意思是这一点,并注意到正确的缩进和处理未知输入的正确方法:

(define (script-fu-prueba modo)
  (cond ((equal? modo "Interactivo")
         (edicionInteractiva RUN-INTERACTIVE))
        ((equal? modo "No interactivo")
         (edicionInteractiva RUN-NONINTERACTIVE))
        (else
         ; it's a good idea to add some error handling
         (error "Modo de edición desconocido" modo))))

答案 1 :(得分:0)

script-fu解释器认为您正在使用cond作为变量并尝试使用一些错误的函数调用来初始化它。您似乎不需要let*句法形式;它的语法是(let ((<name1> <init1>) ...) body1 body2 ...)。请注意,您的代码会将cond显示为name

另外,不要忘记cond是一个表达;类似于C语言<pred> ? <conseqeuent> : <alternate>。因此,您可以将代码提炼为:

(define (script-fu-prueba edicionInteractiva) 
  (edicionInteractiva (cond ((equal? edicionInteractiva "Interactivo")    RUN-INTERACTIVE)
                            ((equal? edicionInteractiva "No interactivo") RUN-NONINTERACTIVE)
                            (else (error "edicionInteractiva unknown")))))

编辑:正如ÓscarLópez所说,你对edicionInteractiva的使用是不一致的;显然是一个字符串或一个函数,不能两者兼而有之。