Сообщение 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
Это из-за замыканий? Такой код:
тоже без 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
Это из-за замыканий? Такой код:
тоже без funcall не работает. Не могу понять, в чем отличие от первого примера со сложением чисел.
Работает:
Не работает:
В последнем случае вообще нет имен, для исключения проблем с namespace'ами.
σ>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'ами.