Создайте список пар из списка

Я новичок в Lisp и понятия не имею, как написать это ...

You give: ("Test" "TEST" "third" "the last")
You get:  (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last"))
Function: (defun choices (&rest choices))

В C я могу просто написать для для этого, но Lisp не может +1 для строки и цикла не имеет счетчика, либо ... Может кто-нибудь, пожалуйста, дайте мне образец?

1

6 ответы

Я бы написал что-то вроде этого:

(defun  choices (&rest choices)
  (loop for i from 1 to 26
        and item in choices
        collect (cons (string (digit-char (+ 9 i) 36))
                      item)))

В приведенном выше коде нет проверки ошибок для более чем 26 вариантов (и вы не указал, как обращаться с ними, если это не ошибка).

Вы можете использовать CHAR-CODE и < a href = "http://www.lispworks.com/reference/HyperSpec/Body/f_code_c.htm" rel = "nofollow"> CODE-CHAR , чтобы "увеличить символ" , но кодировка, которую они предоставляют, не стандартизирована (только некоторые его свойства гарантированы). С DIGIT-CHAR в radix 36, мы гарантированно получить английский алфавит (верхний регистр) для весов 10 до 35.

И, конечно, LOOP имеет много вещей, в том числе любых счетчиков, которые вы хотите.

2
добавлено
Именно то, что я хочу! Спасибо за образец и объяснение :-)
добавлено автор Mike Manilone, источник

Я бы написал что-то вроде этого:

(defun  choices (&rest choices)
  (loop for i from 1 to 26
        and item in choices
        collect (cons (string (digit-char (+ 9 i) 36))
                      item)))

В приведенном выше коде нет проверки ошибок для более чем 26 вариантов (и вы не указал, как обращаться с ними, если это не ошибка).

Вы можете использовать CHAR-CODE и < a href = "http://www.lispworks.com/reference/HyperSpec/Body/f_code_c.htm" rel = "nofollow"> CODE-CHAR , чтобы "увеличить символ" , но кодировка, которую они предоставляют, не стандартизирована (только некоторые его свойства гарантированы). С DIGIT-CHAR в radix 36, мы гарантированно получить английский алфавит (верхний регистр) для весов 10 до 35.

И, конечно, LOOP имеет много вещей, в том числе любых счетчиков, которые вы хотите.

2
добавлено
Именно то, что я хочу! Спасибо за образец и объяснение :-)
добавлено автор Mike Manilone, источник

Я бы написал что-то вроде этого:

(defun  choices (&rest choices)
  (loop for i from 1 to 26
        and item in choices
        collect (cons (string (digit-char (+ 9 i) 36))
                      item)))

В приведенном выше коде нет проверки ошибок для более чем 26 вариантов (и вы не указал, как обращаться с ними, если это не ошибка).

Вы можете использовать CHAR-CODE и < a href = "http://www.lispworks.com/reference/HyperSpec/Body/f_code_c.htm" rel = "nofollow"> CODE-CHAR , чтобы "увеличить символ" , но кодировка, которую они предоставляют, не стандартизирована (только некоторые его свойства гарантированы). С DIGIT-CHAR в radix 36, мы гарантированно получить английский алфавит (верхний регистр) для весов 10 до 35.

И, конечно, LOOP имеет много вещей, в том числе любых счетчиков, которые вы хотите.

2
добавлено
Именно то, что я хочу! Спасибо за образец и объяснение :-)
добавлено автор Mike Manilone, источник

Вы можете объединить два списка так, как вы описали, просто сделав mapcar + cons:

(mapcar #'cons '("A" "B" "C" "D") '("Test" "TEST" "third" "the last"))
; => (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last"))

Поскольку второй список указан, теперь проблема заключается только в создании списка ABCD. Этого можно добиться с помощью loop и code-char:

(loop for i from 65 to 68 collect (string (code-char i)))
; => ("A" "B" "C" "D")

Сочетание этих двух ответов и их адаптация к вашей конкретной проблеме должны быть легкими.

1
добавлено

Вы можете объединить два списка так, как вы описали, просто сделав mapcar + cons:

(mapcar #'cons '("A" "B" "C" "D") '("Test" "TEST" "third" "the last"))
; => (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last"))

Поскольку второй список указан, теперь проблема заключается только в создании списка ABCD. Этого можно добиться с помощью loop и code-char:

(loop for i from 65 to 68 collect (string (code-char i)))
; => ("A" "B" "C" "D")

Сочетание этих двух ответов и их адаптация к вашей конкретной проблеме должны быть легкими.

1
добавлено

Вы можете объединить два списка так, как вы описали, просто сделав mapcar + cons:

(mapcar #'cons '("A" "B" "C" "D") '("Test" "TEST" "third" "the last"))
; => (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last"))

Поскольку второй список указан, теперь проблема заключается только в создании списка ABCD. Этого можно добиться с помощью loop и code-char:

(loop for i from 65 to 68 collect (string (code-char i)))
; => ("A" "B" "C" "D")

Сочетание этих двух ответов и их адаптация к вашей конкретной проблеме должны быть легкими.

1
добавлено
pro.lisp
pro.lisp
47 участник(ов)

Common Lisp, Scheme/Racket, Clojure, Picolisp. S-expr