> 1 <
Автор | Сообщение |
flow
3 сообщений |
#8469 2020-10-26 18:05 GMT+3 часа(ов) |
Добрый день.
А как написать функцию которая возвращает введенный аргумент-символ без изменений? Так: ?> (НАЗВАНИЕ-АРГУМЕНТА что-то) ; без кавычки перед "что-то" > что-то Или с 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. отредактировал(а) flow: 2020-10-26 18:12 GMT+3 часа(ов) |
|
> 1 <