Size: a a a

2021 March 27

T

TGG in Lisp Forever
источник

T

TGG in Lisp Forever
источник

AE

Alexey Egorov in Lisp Forever
>peppers are always greener
источник

AE

Alexey Egorov in Lisp Forever
Лолд.
источник

a

akater in Lisp Forever
Че-то не могу найти ответ в hyperspec быстро: а что должно делать (defun (setf ..) ..)?  Я, конечно, могу предположить, но хотелось бы спецификацию.
источник

LL

Lämppi Lütti in Lisp Forever
Чемииннын онорыль какой-то монгольский
источник

DP

Dmitry Plesovskykh in Lisp Forever
akater
Че-то не могу найти ответ в hyperspec быстро: а что должно делать (defun (setf ..) ..)?  Я, конечно, могу предположить, но хотелось бы спецификацию.
источник

DP

Dmitry Plesovskykh in Lisp Forever
источник

a

akater in Lisp Forever
Это-то я в курсе, но оно не отвечает на вопрос, что должен делать defun setf.
источник

DP

Dmitry Plesovskykh in Lisp Forever
я походу не ту ссылку дал, в смысле на #function_block_name там должен быть линк. но вообще на все сразу определение ф-ции
источник

DP

Dmitry Plesovskykh in Lisp Forever
источник

DP

Dmitry Plesovskykh in Lisp Forever
то есть если формально прочесть определения: function name n. 1. (in an environment) A symbol or a list (setf symbol) that is the name of a function in that environment. 2. A symbol or a list (setf symbol).
источник

a

akater in Lisp Forever
Да про name все понятно.
источник

a

akater in Lisp Forever
Судя по тому, что написано в HyperSpec про defun, defun с поддержкой setf можно было бы имплементировать в терминах обычного dufun каким-то таким образом:

(defmacro my-defun/lisp (fname arglist &body body)
 (cond
  ((symbolp fname) `(defun ,fname ,rglist ,@body))
  ((and (consp fname) (eq 'setf (car fname)))
   (let ((block-name (cadr fname)))
     `(setf (fdefinition ',fname)
            (lambda ,arglist
              ;; [[declaration* | documentation]]
              (block ,block-name ,@body)))))
  (t (error 'some-defun-error))))


Но если в чистом виде писать так, то, хотя макрораскрытие итоговой setf-формы будет правильное, но, например, при вычислении самой defun-формы будет style-warning про неопределенную функцию (setf f), и я не понимаю, это так и надо или нет, но че-то кажется, что не надо.
источник

DP

Dmitry Plesovskykh in Lisp Forever
и определение function_block_name
источник

DP

Dmitry Plesovskykh in Lisp Forever
мне кажется там все написано достаточно формально: If the function name is a list whose car is setf and whose cadr is a symbol, its function block name is the symbol that is the cadr of the function name. An implementation which supports additional kinds of function names must specify for each how the corresponding function block name is computed.
источник

DP

Dmitry Plesovskykh in Lisp Forever
есть идет (setf symbol) тогда этот символ и будет именем function block name и его обязательно надо определить (для setf)
источник

DP

Dmitry Plesovskykh in Lisp Forever
> при вычислении самой defun-формы будет style-warning про неопределенную функцию (setf f), и я не понимаю, это так и надо или нет, но че-то кажется, что не надо.

скорее всего там варнинги гвоздями прибиты
источник

DP

Dmitry Plesovskykh in Lisp Forever
ну то есть никто не заморачивался с тем, что ты сам можешь перереализовать стандартное поведение defun в комбинации с setf, скорее всего это варнинг "не по стандарту"
источник

a

akater in Lisp Forever
> Evaluating defun causes function-name to be a global name for the function
> specified by the lambda expression


> (lambda lambda-list
>   [[declaration* | documentation]]
>   (block block-name form*))

> processed in the lexical environment in which defun was executed.

Я так понимаю, либо я написал не как hyperspec говорит (тогда покажите, где неправ), либо как надо, но вижу style warning, то hyperspec что-то не договаривает.
источник