Bob*_*ong 1 lisp list common-lisp
我已经搜索谷歌和其他地方一段时间,但我无法找到如何生成或创建点对.我问这个因为,我需要打开一个如下所示的列表:
(X Y Z)
Run Code Online (Sandbox Code Playgroud)
到以这种格式的列表:
((X . 1) (Y . 2) (Z . 3))
Run Code Online (Sandbox Code Playgroud)
数字代表索引的位置.我有一个函数将列表转换为格式
(X 1 Y 2 Z 3)
Run Code Online (Sandbox Code Playgroud)
这是这个功能:
(defun listFormat (l)
(defun place-index (idx l)
(if (null l)
nil
(append (list (first l)) (list idx)
(place-index (+ idx 1) (rest l)))))
(place-index 1 l))
Run Code Online (Sandbox Code Playgroud)
但我不知道如何获得点对.提前致谢
Rai*_*wig 11
您的代码有一个非常基本的错误:
(defun listFormat (l)
(defun place-index (idx l) ; <<<---- This DEFUN is wrong
(if (null l)
nil
(append (list (first l)) (list idx)
(place-index (+ idx 1) (rest l)))))
(place-index 1 l))
Run Code Online (Sandbox Code Playgroud)
不要嵌套DEFUN.那是错的.DEFUN定义了一个全局函数.每当运行listFormat时,它都会重新定义GLOBAL函数PLACE-INDEX.您可能已使用DEFINE在SCHEME中看到过类似的嵌套函数.在Common Lisp中,您不应该将DEFUN用于嵌套的本地函数.
在Lisp中,本地函数使用FLET或LABELS定义(用于递归函数).
(defun listFormat (l)
(labels ((place-index (idx l)
(if (null l)
nil
(append (list (first l)) (list idx)
(place-index (+ idx 1) (rest l))))))
(place-index 1 l)))
Run Code Online (Sandbox Code Playgroud)
Stackoverflow也是解决你的功课的错误地方.谷歌搜索也是学习Lisp编程的错误方法.
我建议使用旧的方式阅读介绍性书籍和使用参考.
这是一本基本的Lisp入门书籍:Common Lisp:一个温和的符号计算简介.
参考表:一个小的Common Lisp快速参考(PDF)和一个更详细的Common Lisp快速参考.
点对在Lisp 中称为conses.
请参阅Common Lisp的实际在线参考,Common Lisp HyperSpec.
您希望else-branch读取:
(cons (cons (first l) idx) (place-index (+ idx 1) (rest l)))
Run Code Online (Sandbox Code Playgroud)