Я хочу перебрать этот мой список. Как это сделать?
(setq my-list '[((a . 1) (b . 2)) ((c . 3))])
(loop for k in my-list do
(cl-loop for (i . j) in k do
(message "%c %d" i j)
)
Я попробовал это, но потерпел неудачу. Сообщение об ошибке: «Значение символа равно void k».
Попробуйте использовать макрос dolist
следующим образом:
(setq my-list '(((a . 1) (b . 2)) ((c . 3))))
(dolist (entry my-list)
(dolist (pair entry)
(message "Key: %s, Value: %s" (car pair) (cdr pair))))
Этот код работает:
(let ((my-list [((a . 1) (b . 2)) ((c . 3))]))
(cl-loop for k across my-list do
(cl-loop for (i . j) in k do
(message "%s %d" i j))))
(мой-список — это вектор списков, а не список)
Некоторые советы, которые следует иметь в виду:
Литеральные векторы против списков. При объявлении литерального вектора используйте квадратные скобки []
без кавычек:
(равно '[1 2 3] [1 2 3]) ;; => т
При использовании cl-loop используйте ключевое слово across
для векторов, а не in
:
(cl-цикл для k в моем списке do...)
Символы Лиспа и символы. В Лиспе символы отличаются от символов. Если вы хотите использовать символы (например, тип char
в C), используйте обозначение ?
:
(сообщение "%c" ?A) ;; => А
Итак, ваш вектор должен выглядеть так:
(setq my-list [((?a . 1) (?b . 2)) ((?c . 3))])
При печати символов Lisp используйте спецификацию формата %s
:
(message "%s" 'hello)
;; => hello
(setq my-var 'other-symbol)
(setq other-symbol 1)
(symbol-value my-var)
;; => 1
нет ли способа отсортировать '[] без изменения его на '()'?
Конечно, вы можете использовать массив списков вместо списка списков, но в этом случае вам придется использовать функции, работающие с массивами. @BadEnglish дал вам действительно хороший ответ. Вот альтернатива cl-loop, которая напоминает ответ @Bretts, но вместо этого использует ваш массив:
(let ((my-list [((a . 1) (b . 2)) ((c . 3))]))
(dotimes (i (length my-list))
(dolist (elt (aref my-list i))
(message "%S" elt))))
Сначала я опубликовал комментарий, но, похоже, в комментариях нельзя форматировать код, поэтому вместо этого я сделал это ответом.
нет ли способа отсортировать '[] без изменения его на '()'?