Как получить точечные пары в Лиспе? - PullRequest
1 голос
/ 31 января 2011

Я некоторое время искал в Google и других местах, но не могу узнать, как создавать или создавать точечные пары. Я спрашиваю об этом, потому что мне нужно включить список, который выглядит следующим образом:

(X Y Z)

К списку в этом формате:

((X . 1) (Y . 2) (Z . 3))

Где цифры представляют индекс. У меня есть функция, которая превращает список в формат

(X 1 Y 2 Z 3)

Вот эта функция:

  (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))

Но я не уверен, как получить точечные пары. Заранее спасибо

Ответы [ 3 ]

11 голосов
/ 31 января 2011

Ваш код содержит очень простую ошибку:

(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))

Не вкладывать DEFUN.Это просто неправильно .DEFUN определяет глобальную функцию.Всякий раз, когда вы запускаете listFormat, он переопределяет функцию GLOBAL PLACE-INDEX.Возможно, вы видели подобные вложенные функции в SCHEME, используя DEFINE.В 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)))

Также Stackoverflow является неправильнымместо, чтобы решить свою домашнюю работу.Поиск в Google также является неправильным способом изучения программирования на Лиспе.

Я предлагаю использовать старый добрый способ чтения вводной книги и использования справочника.

Вот базовое введение Книга Lisp для скачивания: Common Lisp: Нежное введение в символьные вычисления .

Справочные листы : маленький Краткий справочник по Lisp * Краткий справочник (PDF) и более подробный Краткий справочник Common Lisp .

Пунктирные пары называются conses в Лиспе.

См. Настоящий онлайн-справочник по Common Lisp, Common Lisp HyperSpec .

6 голосов
/ 31 января 2011

Вы хотите, чтобы ветвь else читала:

(cons (cons (first l) idx) (place-index (+ idx 1) (rest l)))
1 голос
/ 28 марта 2013

И, кстати, для самого вопроса этот код подойдет:

(defun listFormat (lst)
  (loop for idx from 1
        for item in lst
        collect (cons item idx)))
...