Size: a a a

2020 October 26

AE

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

BB

Bird Bird in Lisp Forever
Коммон Лисп.
источник

AE

Alexey Egorov in Lisp Forever
Конкретно клисп?
источник

AE

Alexey Egorov in Lisp Forever
Впрочем не важно.
источник

SA

Sokolov Andrew in Lisp Forever
ну короч нет думаю он считает что так оно сокращенно называется)
источник

SA

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

SA

Sokolov Andrew in Lisp Forever
вот первая функция
источник

SA

Sokolov Andrew in Lisp Forever
пусть это foo
источник

SA

Sokolov Andrew in Lisp Forever
(foo 'x) че дает
источник

SA

Sokolov Andrew in Lisp Forever
?
источник

BB

Bird Bird in Lisp Forever
Это мне вопрос?
источник

SA

Sokolov Andrew in Lisp Forever
+
источник

SA

Sokolov Andrew in Lisp Forever
я из описания не особо понял чего вот тут хочется
источник

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.
Очень много текста, но кажется на самом деле нужен просто какой-то defsetf.
источник

χλ

χоρоший ☽☽☽ λисuчко... in Lisp Forever
>переходишь на язык с первоклассными макросами
>юзаешь quote
источник

AE

Alexey Egorov 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.
источник

BB

Bird Bird in Lisp Forever
Не знаю есть ли встроенное foo, но программисты это словом балуются и иногда встраивают наверное.
источник

AE

Alexey Egorov in Lisp Forever
Первая функция.
источник

SA

Sokolov Andrew in Lisp Forever
ну да типа звучит как identity
источник

SA

Sokolov Andrew in Lisp Forever
ну можешь сам ее написать еще
источник