如何在Lisp中获得点对?

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.


Rap*_*ien 6

您希望else-branch读取:

(cons (cons (first l) idx) (place-index (+ idx 1) (rest l)))
Run Code Online (Sandbox Code Playgroud)