> 1 <

Автор Сообщение

flow

Members


Статус

3 сообщений

Где: Ukraine
Род занятий:
Возраст:

#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 <


Онлайн :

0 пользователь(ей), 36 гость(ей) :