小编Nod*_*mov的帖子

Emacs elisp在Windows上展开文件名行为

在使用el-get安装最后一个cedet时,我在windows上遇到了expand-file-name函数的奇怪行为.该问题与自动加载的生成有关.

最后一个emacs 24.1.50上的autoload.el包含以下功能:

(defun autoload-generated-file ()
  (expand-file-name generated-autoload-file
                ;; File-local settings of generated-autoload-file should
                ;; be interpreted relative to the file's location,
                ;; of course.
                (if (not (local-variable-p 'generated-autoload-file))
                    (expand-file-name "lisp" source-directory))))
Run Code Online (Sandbox Code Playgroud)

在我的例子中,generated-autoload文件是:

"/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/srecode/loaddefs.el" 
Run Code Online (Sandbox Code Playgroud)

因为我有$ HOME $环境变量指向C:/ home/ngulyamov.在这种情况下,上面的函数返回

"d:/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/srecode/loaddefs.el" 
Run Code Online (Sandbox Code Playgroud)

由于源目录包含:

"d:/devel/emacs/emacs-bzr/trunk_jenkins/".
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它将驱动器号从C:更改为D:.同时在emacs 23.3上,此函数返回半正确值,因为source-directory包含值:

"c:/Users/Sean/Downloads/emacs-23.3/".
Run Code Online (Sandbox Code Playgroud)

根据expand-file-name函数说明:

(expand-file-name NAME&optional DEFAULT-DIRECTORY)

将文件名NAME转换为绝对值,并将其规范化.如果NAME是相对的(不以斜线或波浪线开头),则第二个arg DEFAULT-DIRECTORY是要开始的目录 ; 如果DEFAULT-DIRECTORY为零或缺失,则使用当前缓冲区的"default-directory"值.

Windows上的路径永远不会从斜线或波浪线开始.

现在我的问题:1.在Windows上,expand-file-name函数行为是否正确?2.为什么source-directory包含开发人员路径的值?

我们可以将expand-file-name视为Windows上的bug吗?或者它在autoload.el中被错误地使用了?

先感谢您.

emacs elisp

5
推荐指数
1
解决办法
1251
查看次数

Clojure瞬态使用

我在clojure中使用瞬态时有点迷失.任何帮助将不胜感激.示例代码:

(defn test-transient [v]
    (let [b (transient [])]
        (for [x v] (conj! b x))
        (persistent! b)))

user> (test-transient [1 2 3])
[]
Run Code Online (Sandbox Code Playgroud)

我试图在返回之前使其持久化,结果是:

(defn test-transient2 [v]
    (let [b (transient [])]
        (for [x v] (conj! b x))
        (persistent! b)
        b))

user> (test-transient2 [1 2 3])
#<TransientVector clojure.lang.PersistentVector$TransientVector@1dfde20>
Run Code Online (Sandbox Code Playgroud)

但如果我使用conj!它似乎工作正常:

(defn test-transient3 [v]
    (let [b (transient [])]
    (conj! b 0)
    (conj! b 1)
    (conj! b 2)
    (persistent! b)))

user> (test-transient3 [1 2 3])
[0 1 2]
Run Code Online (Sandbox Code Playgroud)

是否有一些约束?如果是这样,我如何将值从持久向量复制到瞬态?

谢谢.

clojure

2
推荐指数
1
解决办法
1894
查看次数

标签 统计

clojure ×1

elisp ×1

emacs ×1