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

编辑2:

这就是它最终的工作方式。也许我编译了一些代码部分,因此从不同的地方加载了一些这样的谜团......

(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特殊形式类似于设置变量的setq值。它setq在两个方面有所不同:首先,如果变量还没有值,它只设置变量的值。如果变量已有值,defvar则不覆盖现有值。第二, [...]

所以我假设你已经为 分配了一些东西test,所以defimage表单什么都不做。如果您正在编辑代码,您可以def-通过在表单上放置点并使用命令eval-defun( C-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 回答