Size: a a a

2020 October 26

SA

Sokolov Andrew in Lisp Forever
ничего он там не жирный
источник

BB

Bird Bird in Lisp Forever
В мегабайтах.
источник

SA

Sokolov Andrew in Lisp Forever
фигня
источник

SA

Sokolov Andrew in Lisp Forever
дискорд жирнее в сто тыщ раз
источник

AE

Alexey Egorov in Lisp Forever
Alexey Egorov
Нужно это для того чтобы setf работал не просто так:
?> (setf список значение) ; ищет глобальную "список"

А так, чтобы setf будучи внутри определения функции ссылался на локальный параметр этой функции "список", которую вводит пользователь но понимает его как-будто это речь об глобальной переменной:
А чему тут не подходит remove-nth?
источник

AE

Alexey Egorov in Lisp Forever
А, её нет.
источник

AE

Alexey Egorov in Lisp Forever
Потому и не подходит.
источник

AE

Alexey Egorov in Lisp Forever
источник

BB

Bird Bird in Lisp Forever
Я вообще не нашёл remove-nth, это гипотетическое название. Есть только remove, но оно из списка '( 1 2 3 3 4) удаляет сразу две тройки. А мне надо первую встречную.
источник

AE

Alexey Egorov in Lisp Forever
Тебе надо не тройку, а по индексу 3.
источник

SA

Sokolov Andrew in Lisp Forever
ну такое удаление самом написать надо
источник

BB

Bird Bird in Lisp Forever
Ну вот.
источник

BB

Bird Bird in Lisp Forever
Про-cdr-ить не сложно, но setf этот результат не ловит.
источник

a

akater in Lisp Forever
Bird Bird
Добрый день.
А как написать функцию которая возвращает введенный аргумент-символ без изменений?
Так:
?> (НАЗВАНИЕ-АРГУМЕНТА что-то) ; без кавычки перед "что-то"
> что-то

Или с 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.
Если надо

(setf (НАЗВАНИЕ-АРГУМЕНТА список) (remove-nth место-удаления список))

то придется использовать defsetf или (в сложных случаях) define-setf-expander

но (setf (nth n list) new) уже есть, например
источник

BB

Bird Bird in Lisp Forever
Если без identity (если это в в самом деле заработает).
источник

SA

Sokolov Andrew in Lisp Forever
identity есть в стандарте
источник

SA

Sokolov Andrew in Lisp Forever
так что заработает
источник

AE

Alexey Egorov in Lisp Forever
Аа, я кажется понял, в чём проблема.
источник

AE

Alexey Egorov in Lisp Forever
Надо чтобы функция мутировала переданный список?
источник

SA

Sokolov Andrew in Lisp Forever
ну это не проблема если внутри то
источник