Почему мой условный оператор игнорируется?

Я пытаюсь написать сценарий схемы для GIMP 2.8, который будет изменять размер и переименовывать/копировать файлы. В рамках этого я хотел бы изменить имя выходного файла на основе логического набора в сценарии.

Однако мой условный оператор игнорируется. Вот отрывок из сценария (на основе одного из эта тема):

(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) 

)

Я пытался использовать when и if-else, но независимо от того, что ни один оператор внутри условного блока не выполняется (т.е. если бы у меня было одно и то же утверждение для истинного и ложного в if, ни один из них не был бы выполнен). Мое условие полностью игнорируется, но я не знаю, почему. GIMP не сообщает о каких-либо синтаксических ошибках.

Я подозреваю, что у меня не может быть условного оператора внутри оператора define, за исключением того, что он работает прямо под ним.

Кто-нибудь может увидеть, что не так? Почему мое условие игнорируется?


person sebf    schedule 24.05.2012    source источник


Ответы (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>)))
person Óscar López    schedule 24.05.2012
comment
Спасибо за ваш ответ. Я пытаюсь установить значение name0 в name1. (Я пробовал (set! name0 name1), но это не работает) - person sebf; 24.05.2012
comment
@sebf это должно работать, другого способа написать это нет. Может быть, это из-за лишних скобок? или, может быть, есть проблема где-то еще в вашем коде. Проверьте мой обновленный ответ, если это не сработает, проблема в другом, но условное утверждение больше не является неправильным. - person Óscar López; 24.05.2012
comment
@sebf при ближайшем рассмотрении в вашем коде есть несколько других проблем. Я снова обновил свой ответ. - person Óscar López; 24.05.2012
comment
Чем вам очень. Это была комбинация оператора let* и лишних скобок. Теперь он работает, и я возвращаю функциональность (начиная с полезного условия!) - person sebf; 24.05.2012