1

文字通り例に従ったと思いますが、うまくいきません。マクロを使用するdefimageと、イメージ記述子は作成されませんが、使用create-imageするとすべて同じ引数になります。以下は私が試したものです:

(defimage test ((:type png :file "/home/wvxvw/Projects/haxe-mode/trunk/ede/etc/images/interface.png")))
test                                    ; nil
(defimage test (:type png :file "/home/wvxvw/Projects/haxe-mode/trunk/ede/etc/images/interface.png"))
test                                    ; nil
(insert-image test)                     ; error
(setq test (create-image "/home/wvxvw/Projects/haxe-mode/trunk/ede/etc/images/interface.png" 'png nil))
(image :type png :file "/home/wvxvw/Projects/haxe-mode/trunk/ede/etc/images/interface.png")
(insert-image test)                     ; shows image

ヒントはありますか?

編集:

上記のコードは問題を示しているはずですが、実行しようとしている実際のコードはもう少し複雑です。念のため投稿する:

(require 'cl)

(defvar haxe-images-dir
  (concat (file-name-directory load-file-name) "etc/images/"))

(defmacro haxe-define-images (images)
  (append
   '(progn)
   (loop for image in images
         collect
         `(defimage ,(intern (concat "haxe-" image "-icon"))
            ((:type png :file
                    (concat haxe-images-dir ,(concat image ".png"))))))))

(haxe-define-images
 ("private" "public" "static" "instance" "inline"
  "volatile" "variable" "class" "interface" "macro"
  "enum" "deftype" "function"))

EDIT2:

これが最終的に機能する方法です。おそらく、コードの一部をコンパイルして別の場所からロードしたか、そのような謎...

(require 'cl)
(require 'haxe-project)

(defmacro haxe-define-images (images)
  (append
   `(progn)
   (loop for image in images
         with images-root = (concat haxe-install-dir "etc/images/")
         collect
         `(defimage ,(intern (concat "haxe-" image "-icon"))
            ((:type png :file
                    ,(concat images-root image ".png")))))))

(haxe-define-images 
 ("private" "public" "static" "instance" "inline"
  "volatile" "variable" "class" "interface" "macro"
  "enum" "deftype" "function"))
4

1 に答える 1

1

変数がまだ設定されていない場合にのみ変数を設定するのは、defimageおよび他のフォームの機能です。def-ドキュメントからdefvar

特殊な形式は、変数の値を設定するという点で に似defvarています。setq2 つの点で異なりsetqます。まず、変数がまだ値を持っていない場合にのみ、変数の値を設定します。変数がすでに値を持っている場合defvar、既存の値をオーバーライドしません。2番、 [...]

だから、あなたはすでに に何かを割り当てているとtest思うので、defimageフォームは何もしません。コードを編集中の場合は、フォームにポイントを置き、コマンド( )def-を使用して、フォームを強制的に評価できます。eval-defunC-M-x

defimageグローバル変数の宣言にのみ使用する必要があることに注意してください。それ以外の場合 (イメージをローカルで使用する場合) は、find-image代わりに を使用してください。


更新されたコードでは、マクロhaxe-define-imagesは式の評価に失敗します(concat haxe-images-dir ...)。マクロを展開すると、これを確認できます。

 ELISP> (print (macroexpand-all '(haxe-define-images ("foo"))))
 (progn (defvar haxe-address-icon (find-image (quote ((:type png :file (concat haxe-images-dir "address.png"))))) nil))

concatが内部にquoteあり、評価されないため、これは機能しません。代わりに次のように書く必要があります。

(defmacro haxe-define-images (images)
  (append
   '(progn)
   (loop for image in images
         collect
         `(defimage ,(intern (concat "haxe-" image "-icon"))
            ((:type png :file
                    ,(concat haxe-images-dir image ".png")))))))

(実際に の評価を遅らせるつもりならhaxe-images-dir、マクロはこれよりも複雑にする必要がありますが、ここから理解できると確信しています。)

于 2012-11-04T19:32:30.050 に答える