Информация об изменениях

Сообщение Re[2]: Как работает funcall в Лиспе? от 06.07.2024 0:26

Изменено 06.07.2024 1:11 Worminator X

Re[2]: Как работает funcall в Лиспе?
Здравствуйте, σ, Вы писали:

σ>https://stackoverflow.com/questions/36978694/why-must-i-funcall-a-function-returned-from-another

σ>https://chatgpt.com/share/694e899c-6a62-4100-8640-213502335b7a

So something like

(((lambda (foo)
    (lambda (bar)
      (list foo bar)))
  1)
 2)

is not valid Common Lisp.


Это из-за замыканий? Такой код:

(setq User-counter 0)
(defun User (name)
    (let
     (
      (id (setq User-counter (+ User-counter 1)))
     )
     (lambda (method)
             (cond
                 ((eq method 'getId) (lambda () 1))
                 ((eq method 'getName) (lambda () "W"))
                 ((eq method 'data) (lambda () (list 1 "W")))
                 ((eq method 'format) (lambda (f) (format NIL f 1 "W")))
             )
     )
    )
)


тоже без funcall не работает. Не могу понять, в чем отличие от первого примера со сложением чисел.
Re[2]: Как работает funcall в Лиспе?
Здравствуйте, σ, Вы писали:

σ>https://stackoverflow.com/questions/36978694/why-must-i-funcall-a-function-returned-from-another

σ>https://chatgpt.com/share/694e899c-6a62-4100-8640-213502335b7a

So something like

(((lambda (foo)
    (lambda (bar)
      (list foo bar)))
  1)
 2)

is not valid Common Lisp.


Это из-за замыканий? Такой код:

(setq User-counter 0)
(defun User (name)
    (let
     (
      (id (setq User-counter (+ User-counter 1)))
     )
     (lambda (method)
             (cond
                 ((eq method 'getId) (lambda () 1))
                 ((eq method 'getName) (lambda () "Worminator"))
                 ((eq method 'data) (lambda () (list 1 "W")))
                 ((eq method 'format) (lambda (f) (format NIL f 1 "Worminator")))
             )
     )
    )
)


тоже без funcall не работает. Не могу понять, в чем отличие от первого примера со сложением чисел.

Работает:
(print ((lambda(id name) (format NIL "id: ~d, name: ~s" id name)) 1 "Worminator"))


Не работает:
(print (((lambda(id name) (lambda (f) (format NIL f id name)) id name) 1 "Worminator") "id: ~d, name: ~s"))


(print (((lambda() (lambda (f) (format NIL f 1 "Worminator")))) "id: ~d, name: ~s"))


(print (((lambda() (lambda () (format NIL "id: ~d, name: ~s" 1 "Worminator"))))))


В последнем случае вообще нет имен, для исключения проблем с namespace'ами.