Добрый день.
А как написать функцию которая возвращает введенный аргумент-символ без изменений?
Так:
?> (НАЗВАНИЕ-АРГУМЕНТА что-то) ; без кавычки перед "что-то"
> что-то
Или с car:
?> (НАЗВАНИЕ-АРГУМЕНТА что-то)
> (что-то)
?> (car (НАЗВАНИЕ-АРГУМЕНТА что-то))
> что-то
Я не разбираюсь в макросах, но я когда-то уже написал такую функцию (не помню был ли это defmacro, а не defun, но я мог для эксперимента defmacro подставить, чтобы заработало). В определении функции я написал какое-то количество backquote и наверное запятых тоже. Было что-то очень простое, в одну строку. И функция работала. Это была смесь из list, eval и одинарных кавычек (кажется разных, то есть встерчались и backquote и просто quote), и оно как-то "заморозило" вычисление, вернуло то что надо. Символа @ кажется не было.
Нужно это для того чтобы setf работал не просто так:
?> (setf список значение) ; ищет глобальную "список"
А так, чтобы setf будучи внутри определения функции ссылался на локальный параметр этой функции "список", которую вводит пользователь но понимает его как-будто это речь об глобальной переменной:
?> (defun удалить-в-списке (список место-удаления)
(setf (НАЗВАНИЕ-АРГУМЕНТА список) (remove-nth место-удаления список)))
?> (setq тест '(1 2 3))
Счёт удаляемого начинается не с нуля, а единицы.
Должно работать так:
>? (удалить-в-списке тест 2)
> (1 3)
>? (удалить-в-списке тест 3)
> (1)
>? (удалить-в-списке тест 1)
> ()
>? тест
> ()
В результате остался пустой список.
То есть нужно чтобы setf брал именно введенный параметр/аргумент от пользователя (он может иметь любое название, без двойных кавычек, а просто атом), а не искал уже отпределённую переменную.
Если бы опеределялось без "НАЗВАНИЕ-АРГУМЕНТА":
?> (defun удалить-в-списке (список место-удаления)
(setf список (remove-nth место-удаления список)))
то оно просто возвращает временно изменённый список и присвоение через setf "не работает":
>? удалить-в-списке тест 2)
> (1 3)
>? удалить-в-списке тест 3)
> (1 2)
>? (удалить-в-списке тест 1)
> (2 3)
> тест
(1 2 3)
Нужно под clisp.