Elisp 如何把一个字符串转换成 list ?

请教一下, 我想把一个字符串转换成 list, 方便使用.

我查了一下有个 append 方法可以把字符串放到 list 里, 于是我写了一个这样的方法

(setq myList (append "abcdef"))
(dotimes (i (length myList))
  (insert i)
  )

然后执行以后却是这样子: 有些不太明白, 不知道哪里出了问题, 请教一下论坛里的大神.:grinning: 想要的结果就是输出 “abcdefg”

我记得 dotimes 的功能是重复执行。你这么做是把(insert i)执行了length次,执行的时候分别把i赋值成0,1,length-1

我写 dotimes 是为了遍历 list, 我想把字符串里的内容一个字符一个字符地打印出来啊.

我现在的问题其实是 (append "abcdef") 这个方法是返回一个 (list “a” “b” “c” “d” “e” “f”) 吗?

就类似于 C 或者 Java 遍历字符串的操作, 我想在 elisp 里实现.

append貌似并不是把一个字符串变成一个 list,你可以试试我下面的方法:

(setq my-list (map 'list (lambda (i)
                           (string i)) (string-to-list "abcdef")))

(dotimes (i (length my-list))
  (insert "\"" (nth-value i my-list) "\" "))
2 个赞

多谢子龙山人, 这串代码是我想要的输出. 然后我查了一些 append 的说明

Concatenate all the arguments and make the result a list.

这个应该是将所有的参数转化为 list 的意思吧

所以我只修改了后半句话

(setq myList (append "abcdef"))

(dotimes (i (length myList))
  (insert "\"" (nth-value i myList) "\" ")
  )"a" "b" "c" "d" "e" "f" 

输出就是 abcdef 了

所以问题应该出在 insert 这个方法上吧, 我之前这样

(dotimes (i (length myList))
  (insert i)
  )

貌似是把自增变量输出了囧… 还是基本语法没搞明白:joy:

Elisp 中,字符串是元素为字符的数组,字符也是用数字表示。所以字符串转对应 List 的话

(append "abcdef" nil)
     => (97 98 99 100 101 102)

至于要转成对应字符的字符串形式的话

(mapcar #'char-to-string "abcdef")
     => ("a" "b" "c" "d" "e" "f")
1 个赞

又了解了许多. 再多问一句,

里面这个 # 号代表什么意思呢, 我试了一下加不加 # 的输出都是一样的诶.

#‘代表函数,’表示Symbol,这个属于语法糖,不过一般省略#也没关系

#'(function ...) 的简写(在 (elisp) Anonymous Functions 中有解释),正如 '(quote ...) 的简写。C-h f function

function is a special form in `C source code'.

(function ARG)

Like `quote', but preferred for objects which are functions.
In byte compilation, `function' causes its argument to be compiled.
`quote' cannot do that.

原来如此, 涨知识了.

  1. (append "abcdef")的结果是"abcdefg" 而不是list, 要变成list,你需要用(append "abcdef" nil)
  2. 如果是想插入list中的各个值,用dolist代替dotimes更方便,像这样
  (setq myList (append "abcdef" nil))
  (dolist (c myList)
    (insert c))
  1. 字符串也是序列类型,可以直接用(elt SEQUENCE N) 取序列中第N位的值,像这样
(setq myStr "abcdef")
(dotimes (i (length myStr))
  (insert (elt myStr i)))
1 个赞

多谢解答和纠错,这样就理解的更全面了😎

cl中一般会用push/nreverse来构建一个list。