Рассмотрим модуль со следующими процедурами:
(define-module (test test)
#:export (proc1 proc2 proc3))
(define proc1
(let ((module (current-module)))
(lambda ()
(format #t "~s\n" module))))
(define proc2
(lambda ()
(let ((module (current-module)))
(format #t "~s\n" module))))
(define (proc3)
(let ((module (current-module)))
(format #t "~s\n" module)))
У меня сложилось впечатление, что все это было эквивалентно, но это не так.
scheme@(guile-user)> (use-modules (test test))
scheme@(guile-user)> (proc1)
#<directory (test test) 562a062152d0>
$1 = #t
scheme@(guile-user)> (proc2)
#<directory (guile-user) 562a05b8bbd0>
$2 = #t
scheme@(guile-user)> (proc3)
#<directory (guile-user) 562a05b8bbd0>
$3 = #t
Только в proc1
символ module
внутри лямбда-выражения привязан к модулю, в котором определена процедура.
Может кто-нибудь объяснить это? Означает ли это, что я всегда должен использовать первую форму, если я хочу создать замыкание?