无法在 Emacs 中添加功能

Cannot add function in Emacs

我最近开始使用 Emacs,我正在尝试添加一个函数,将输入的句子拆分为单词列表(拆分为一个 space):

(defun split-by-one-space (string)    ; from: http://cl-cookbook.sourceforge.net/strings.html
        "Returns a list of substrings of string
        divided by ONE space each.
        Note: Two consecutive spaces will be seen as
        if there were an empty string between them."
    (loop for i = 0 then (1+ j)
          as j = (position #\Space string :start i)
          collect (subseq string i j)
          while j))

(defun myfn (ss)
    "documentation of fn: to be added"
    (interactive "s\Enter some words: ")
    (message "Read: %s" (split-by-one-space ss)))

我将上面的内容保存在文件夹 ~/.emacs.d/init.el 中,其中还有 2 个其他功能也已正确拾取并执行。但是,当我尝试使用 M-x 方法执行时,找不到上述函数 'myfn'。函数 'split-by-one-space' 也没有找到。

问题出在哪里,如何解决?

编辑:

使用命令“emacs --debug-init”启动 Emacs 显示以下错误:

(invalid-read-syntax "#")

显然 \#Space 在 Emacs Lisp 中无法识别。我将其替换为 '?\ ',此错误消失了。函数 myfn 现在可以执行了。但是,在执行它时,会显示以下错误:

Symbol's function definition is void: loop

显然循环部分需要用 Emacs Lisp 重写。

#\Space 不是有效的 Elisp 并且会导致读取错误,因此大多数 Emacs 将在此时停止处理您的文件。你想改为写 ?\s?\,这是 Elisp 中用于字符文字的语法。

之后,您会看到 loop 不为 Emacs 所知。您想改用 cl-loop,它由 cl-lib 包提供,因此您不仅需要将 loop 重命名为 cl-loop,还需要添加

(require 'cl-lib)

早些时候。同样,Elisp 不知道 subseqpositions,您需要使用 cl-subseqcl-position(也由 cl-lib 提供)。