我可以从"外部"中调用里面的一个local
的函数吗?让我们说我们有函数A.它调用一个在本地内部的函数。功能A不在本地。这可能吗?
或者是local
内部能够调用函数的函数,即"外部"那个local
?
我知道其中一个论点是错误的,但我不记得其中哪一个和为什么。有人可以向我解释哪一个是正确的为什么?
(球拍)
答案 0 :(得分:2)
我认为这会有所帮助
#lang racket
(define (A x)
(local [(define (localA y)
(printf "localA ~a ~a\n" x y)
(printf "i can call B\n")
;; here we see localA, A, and B
(B (+ 1 x)))]
;; here we see localA, A, and B
(localA (* x 2))))
(define (B x)
(local [(define (localB y)
(printf "localB ~a ~a\n" x y)
(printf "i can call A\n")
;; here we see localB, B, and A
(A (+ 1 x)))]
;; here we see localB, B, and A
(localB (* x 3))))
(A 0)
; localA 0 0
; i can call B
; localB 1 3
; i can call A
; localA 2 4
; i can call B
; localB 3 9
; i can call A
; localA 4 8
; i can call B
; localB 5 15
; i can call A
; localA 6 12
; i can call B
; localB 7 21
; ...
A
无法致电localB
而B
无法致电localA
答案 1 :(得分:2)
在其封闭范围内创建嵌套的任何新范围。
范围区域中的任何标识符也位于其封闭范围内,并且可以使用同一范围内的任何其他标识符或其封闭范围。
您不能在其范围之外使用标识符;但你可以使用它引用的值,从该内部范围返回该值"向上"。
答案 2 :(得分:1)
除非通过向上或向下的funarg或mutate绑定与本地闭包明确地公开它们,否则不能在其作用域之外使用本地绑定。例如:
(define (test n)
(local [(define (helper from acc)
(if (> from n)
acc
(helper (add1 from) (cons from acc))))]
(helper 1 '())))
(test 5) ; ==> (5 4 3 2 1)
无法从helper
外部访问或致电test-sum
,因为它test-sum
是本地的,但未通过或返回。
(define (upward funarg1 n)
(local [(define (helper from acc)
(if (> from n)
acc
(helper (add1 from) (cons from acc))))]
(funarg1 helper)))
(define (test funarg2)
(funarg2 1 '()))
(upward test 5) ; ==> (5 4 3 2 1)
这里helper
作为参数传递给回调。您可以在此处helper
使用本地test
。两者的闭包是不同的,因此test
没有n
,因为它们不共享任何词汇变量。
(define (downward n)
(local [(define (helper from acc)
(if (> from n)
acc
(helper (add1 from) (cons from acc))))]
helper))
(define from-helper (downward 5))
(from-helper 1 '()) ; ==> (5 4 3 2 1)
((downward 10) 5 '()) ; ==> (10 9 8 7 6 5)
在这里你返回帮手。全局范围将无法访问n
中的helper
,但他们可以调用它,它的工作方式与内部调用方式相同。自helper
完成以来downward
中的变量似乎已经死亡,但Scheme保留了词法范围,因此n
和helper
可以从helper
获得只要它存在。
(define exposed #f)
(define (mutate n)
(local [(define (helper from acc)
(if (> from n)
acc
(helper (add1 from) (cons from acc))))]
(set! exposed helper)))
(mutate 5)
(exposed 1 '()) ; ==> (5 4 3 2 1)
这只是向下funarg的变种。而不是返回它会改变全局(或词法)变量exposed
,其中具有全局,词法或自由变量的代码将能够在(mutate 5)
完成其事后调用。