我正在尝试使用一个脚本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")
)
有什么错误?
我还想在肯定和否定的情况下制作一个包含多个陈述的条件陈述。
感谢您的帮助。
答案 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
的使用是不一致的;显然是一个字符串或一个函数,不能两者兼而有之。