Я новичок в Lisp. Я пытаюсь написать функцию, которая будет принимать список точечных списков (представляющих количество монет определенного значения), например.Цитирование по списку и добавление к нему нового
((1 . 50) (2 . 20) (3 . 10)) ;; one 50 cent coin, two 20 cent coins, three 10 cent coins
и затем конвертировать его в список каждой монеты по значению, например.
(50 20 20 10 10 10)
Не должно быть слишком сложно, не так ли? Это то, что у меня есть до сих пор. Тем не менее, он возвращает NIL. Есть идеи по исправлению этого?
(defun fold-out (coins)
(let ((coins-list (list)))
(dolist (x coins)
(let ((quantity (car x)) (amount (cdr x)))
(loop for y from 0 to quantity
do (cons amount coins-list))))
coins-list))
спасибо. Оба решения действительно полезны, поскольку я только сейчас знакомлюсь с языком. – Charles
Добро пожаловать, и вы были довольно близки: замените 'cons' на' push' и 'loop ... to' на' loop ... below' или 'loop repeat quantity' в вашем исходном коде, а результат был бы правильным (хотя и наоборот). – uselpa
Ага, аккуратный. Глядя на документы для 'nconc' сейчас, я вижу, что это функция для конкатенации списков. Но в вышеприведенном решении он только вызывается с одним аргументом за раз ... так где же происходит конкатенация? Это макрос цикла, который заботится об этом? – Charles