鉴于Lisp中代码和数据的"所有列表"同源方法,我很难理解如何在Emacs Lisp中操作alist.特别是,如何将alist转换为普通的双元素列表列表,反之亦然?几乎看起来alist是他们自己的一种特殊类型,它不能像常规列表那样被操纵.
具体示例:我正在尝试在我的.emacs文件中绑定一个键,以使用编程生成的名称创建一个特定大小的帧,如下所示:
(make-frame '((name . "Blarg") (width . 80) (height . 24)))
Run Code Online (Sandbox Code Playgroud)
只要"Blarg"是一个常量字符串,这样就可以正常工作,但是由于alist开头的引用,我不能将任何求值的代码放在一个字符串中代替"Blarg".我想要做的是通过cons宽度和高度的符号和整数,然后add-list是前面的名称来建立一个列表,并将整个事物传递给make-frame.但是如何将结果数据结构转换为alist呢?
关于如何make-frame做我想做的事情的具体答案当然会受到赞赏,但正如我的标题所示,我希望能更详细地解释如何操纵alist并将它们转换为常规列表.
在构建列表时只需要两美分:
(pairlis '(name width height)
'("Blarg" 80 24))
;; => ((name . "Blarg") (width . 80) (height . 24))
Run Code Online (Sandbox Code Playgroud)
@wvxvw回答了你的一般问题.但请注意,所描述的内容并未 将 alist转换为列表,反之亦然.
而在一般情况你并不需要做任何这样的"转换".你可以直接使用alist - 毕竟它们是列表.
这让我想到了你的make-frame问题的答案,就是这个问题,其中foobar包含你想要的名字:
(make-frame `((name . ,foobar) (width . 80) (height . 24)))
Run Code Online (Sandbox Code Playgroud)
或者如果您愿意:
(make-frame (cons (cons 'name foobar) '((width . 80) (height . 24))))
Run Code Online (Sandbox Code Playgroud)