【问题标题】:Why is my conditional statement being ignored?为什么我的条件语句被忽略?
【发布时间】:2012-05-24 10:31:49
【问题描述】:

我正在尝试为 GIMP 2.8 编写一个方案脚本,它将调整文件的大小和重命名/复制文件。作为其中的一部分,我想根据脚本中设置的布尔值更改输出文件名。

然而,我的条件被忽略了。这是脚本的摘录(基于this thread 中的一个):

(define (script-fu-batch-resize globexp globext src) 
 (define (resize-img n f newx suffix srcdir removetailingunderscore) 
  (let* ((fname (car f))

     ;get path, short name + extension (remember to remove source dir to REPLACE with suffix!)
    (fullname (car (last (strbreakup fname "\\"))))
    (filepath (substring fname 0 (- (string-length fname) (string-length (string-append srcdir fullname)))))
    (name0 (car (strbreakup fullname ".")))
    (name1 (substring name0 0 (- (string-length name0) 1)) )

    (when 
    (> 1 0)
    (
        (name0 (name1) )
    )
    )

    (extension (cadr (strbreakup fullname ".")))

     (img   (car (gimp-file-load 1 fname fname)))) 
    (gimp-image-undo-disable img) 
    (let* 
      ( 
         (oldx (car (gimp-image-width  img))) 
         (oldy (car (gimp-image-height img))) 
         (newy (/ oldy (/ oldx newx))) 
       ) 
       (gimp-image-scale img newx newy)         ;changed for Gimp v2.6
     )              
    (gimp-file-save 1 img (car (gimp-image-get-active-drawable img)) (string-append filepath suffix "\\" name1 "." extension) fname) 
        (gimp-image-delete img) 
   ) 
   (if (= n 1) 1 (resize-img (- n 1) (cdr f) newx suffix srcdir removetailingunderscore)) 
  )
 (define sourcepattern (string-append globexp src globext))
 (define files (file-glob sourcepattern 0))                     ;changed for Gimp v2.6 
 (resize-img (car files) (car (cdr files)) 55 "micro" src 1) 

)

我尝试过使用whenif-else,但无论条件块内的任何语句都不会执行(即,如果我在 if 中有相同的 true 和 false 语句,则两者都不会执行)。我的条件被完全忽略了,但我不知道为什么。 GIMP 不报告任何语法错误。

我怀疑我不能在 define 语句中使用条件,除非它正下方有一个。

谁能看出问题所在?为什么我的条件被忽略了?

【问题讨论】:

    标签: scripting if-statement scheme gimp


    【解决方案1】:

    when 表达式存在几个问题:

    • 它使用了几个不必要的括号
    • 条件(> 1 0) 始终为真,因此无用
    • 这不是改变变量值的方法,使用set!
    • 将整个when 表达式移到let* 的变量定义部分之外,使其成为let* 正文中的第一条语句

    你需要做的是这样的:

    (define (script-fu-batch-resize globexp globext src) 
      (define (resize-img n f newx suffix srcdir removetailingunderscore) 
        (let* ((fname (car f))
               (fullname (car (last (strbreakup fname "\\"))))
               (filepath (substring fname 0 (- (string-length fname) (string-length (string-append srcdir fullname)))))
               (name0 (car (strbreakup fullname ".")))
               (name1 (substring name0 0 (- (string-length name0) 1)))
               (extension (cadr (strbreakup fullname ".")))           
               (img   (car (gimp-file-load 1 fname fname))))
          (when (> 1 0)
            (set! name0 name1))
          <rest of the body>)))
    

    【讨论】:

    • 感谢您的回复。我正在尝试将 name0 的值设置为 name1。 (我试过(set!name0 name1)但这不起作用)
    • @sebf 它必须工作,没有其他方法可以编写它。也许是因为额外的括号?或者您的代码中的其他地方可能存在问题。检查我更新的答案,如果这不起作用,那么问题出在其他地方,但条件语句不再错误。
    • @sebf 仔细检查后,您的代码中还有其他几个问题。我再次更新了我的答案。
    • 非常感谢。它是 let* 语句和多余括号的组合。它现在正在工作,我正在重新构建功能(从有用的条件开始!)
    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2021-06-22
    • 2012-07-15
    相关资源
    最近更新 更多