1

私は Script-fu で忙しく、「エラー ( : 1) 不正な関数」が発生し続けます。私は、Scheme/Lisp の専門家ではなく、いくつかの写真タスクを自動化しようとしているだけです。ドキュメンテーションはめったにありません - GiMP は自分自身の内部アクションについてしか書いていませんが、Scheme の構文は Script-fu で書いていないか、GiMP v1.0 の「ヒント」を見つけました (つまり、日付が古すぎて役に立たない)。

私は、GiMP で提供されているスクリプトの束を調べて、より多くのことを学び、これを理解しようとしましたが、役に立ちませんでした。ここで、インデント レイアウトや Python-fu の存在などではなく、バグを削除するための助けを求めます。

そしてそれで、コード(機能的なスケルトンに縮小):

;;
;; 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
)
4

1 に答える 1

1

括弧をブロックとして使用しているようです。例えば:

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

もちろん、最初のものは有効なスキームである関数を返す必要があり、2番目のものからの戻り値は提供された引数になります。副作用のために 2 つの式を実行したい場合は、ブロックを使用する必要があります。beginC 方言ブロックのカーリーのように、Scheme で始まるフォームは次のとおりです。

(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"))
于 2016-12-22T13:18:03.840 に答える