使用列表项中的空格的Emacs lisp列表处理

时间:2014-06-04 16:19:03

标签: recursion emacs elisp

我有一个emacs lisp列表,上面写着:

(setq states '(
              Nebraska
              NE
              Nevada
              NV
              New Hampshire
              NH
              New Jersey)
)

我创建了一个只打印状态名称的函数,而不是缩写:

(defun names (los)
  "Get names from list of states"
  (when los
    (print (car los))
        (names (cdr(cdr los)))
    )
  )

我将该函数称为:(names states)并获取

Nebraska
Nevada
New
NH
Jersey

如何告诉我的lisp函数(或设置我的列表),以便单词中的空格不是分隔符,只有换行符是分隔符?

由于

2 个答案:

答案 0 :(得分:9)

Elisp将空格视为分隔符。要回答这个直接的问题,你可以像帕特里克在评论中所说的那样做,并将字符串放在引号中。

更广泛地说,您应该考虑使用关联列表或属性列表,因为它们是为您考虑的任务而设计的。请阅读assocplist-get以获取更多信息。例子:

alist版本看起来像:

(setq states-alist '((NH "New Hampshire")
                     (NE "Nebraska")
                     (NV "Nevada")))
(cadr (assoc 'NH states-alist))

plist版本看起来像:

(setq states-plist '(NH "New Hampshire"
                     NE "Nebraska"  
                     NV "Nevada"))
(plist-get states-plist 'NH)

答案 1 :(得分:3)

作为Patrick Collins noted in a comment,您应该将列表项置于双引号内,将其转换为字符串:

(setq states '(
              "Nebraska"
              "NE"
              "Nevada"
              "NV"
              "New Hampshire"
              "NH"
              "New Jersey")
)

如果你真的想要,你可以通过使用反斜杠转义空格,将它们保存为符号(就像现在一样),例如: New\ Hampshire。是否使用符号或字符串取决于您要使用它们的目的。