2016-12-22 10 views
0

Я занят скриптом-fu и продолжаю получать «Ошибка (: 1) незаконная функция». Я не эксперт Scheme/Lisp, просто пытаюсь автоматизировать некоторые фотографические задачи. Документация редка - либо GiMP только пишет об их собственных внутренних действиях, но не о синтаксисе Схемы в Script-fu, или я нахожу «советы» для GiMP v1.0 (т. Е. Так устарели, что они бесполезны).GiMP (Scheme) Ошибка скрипта-fu «незаконная функция»

Я посмотрел на кучу скриптов, поставляемых с GiMP, пытаясь узнать больше и понять это, но безрезультатно. Я прошу сюда за помощью, чтобы удалить ошибку, не макета отступа или тот факт, что Python-фу существует и т.д.

И с этим, кодом (сводятся к функциональному скелету):

;; 
;; license, author, blah blah 
;; FOR ILLUSTRATION PURPOSES 
;; GiMP 2.8 LinuxMint 18.1 
;; does the work, but then blows up saying "Error (: 1) illegal function" 
;; 

(define (script-fu-ScriptFails InImage InLayer pickd mrge) 
    (let* (
     (CopyLayer (car (gimp-layer-copy InLayer TRUE))) 
    ) 
    (gimp-image-undo-group-start InImage) 
    (gimp-image-add-layer InImage CopyLayer -1) 
    (gimp-drawable-set-visible CopyLayer TRUE) 
    ;; Perform CHOSEN action on CopyLayer 
    (if (equal? pickd 0) ( ;; keep just the RED 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 1.0 0 0 0 0 0 0 0 0) 
     (gimp-drawable-set-name CopyLayer "RED") 
    )) 
    (if (equal? pickd 1) ( ;; keep just the GREEN 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 1.0 0 0 0 0) 
     (gimp-drawable-set-name CopyLayer "GRN") 
    )) 
    (if (equal? pickd 2) ( ;; keep just the BLUE 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 0 0 0 0 1.0) 
     (gimp-drawable-set-name CopyLayer "BLU") 
    )) 
    (if (equal? mrge #t) ( ;; to merge or not to merge 
     (gimp-layers-flatten InImage) 
    )) 
    (gimp-image-undo-group-end InImage) 
    (gimp-display-flush) 
) 
) 

(script-fu-register "script-fu-ScriptFails" 
    _"<Image>/Script-Fu/ScriptFails..." 
    "Runs but fails at the end. Why? Please help!" 
    "JK" 
    "(pop-zip,G-N-U)" 
    "2016.12" 
    "RGB*" 
    SF-IMAGE  "The Image" 0 
    SF-DRAWABLE "The Layer" 0 
    ;; other variables: 
    SF-OPTION  "Effect" '("R_ed" "G_rn" "B_lu") 
    SF-TOGGLE  "Merge Layers" FALSE 
) 

ответ

0

Похоже, вы используете круглые скобки как блоки. например:

(if (equal? pickd 2) ( ;; keep just the BLUE 
     (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 0 0 0 0 1.0) 
     (gimp-drawable-set-name CopyLayer "BLU") 
    )) 

Вы видите открытие скобки перед комментарием о сохранении синего? Ну это значит, что вы делаете это:

((plu-in....) (gimp-drawable...)) 

Первым, конечно, нужно возвращать функцию, которая будет действительна Scheme и возврат из второго будет поставляться аргументом. Если вы хотите сделать два выражения из-за их побочных эффектов, вы должны использовать блок. Как и фигурная скобка в C диалекты блоков форма, начиная с begin на схеме:

(begin 
    (plu-in....) 
    (gimp-drawable...)) 

Таким образом, это будет оценивать выражения и результат последнего выражения результата, если это также хвост функции.

Также для if только следствие и никакой альтернативы с помощью when даст вам начать:

(when (equal? pickd 2) ;; keep just the BLUE (and no extra parens) 
    (plug-in-colors-channel-mixer TRUE InImage CopyLayer FALSE 0 0 0 0 0 0 0 0 1.0) 
    (gimp-drawable-set-name CopyLayer "BLU")) 
+0

Спасибо так много, Сильвестра. Ваше объяснение «начать» имеет полный смысл - я не обратил внимания на это, пытаясь забрать немного Схемы. Я посмотрел на множество разных примеров и других сценариев, которые я начал загипнотизировать. Применяя это для правильного использования синтаксиса, когда все это работает. У меня был традиционный C-мозг, пытающийся создать блок для двух инструкций. Схема, еще одна маленькая история. Весело учиться. Еще раз спасибо! – fotonix