本地:从"外部"呼叫功能来自"内部"?

时间:2017-11-23 18:23:04

标签: function functional-programming scheme racket local

我可以从"外部"中调用里面的一个local的函数吗?让我们说我们有函数A.它调用一个在本地内部的函数。功能A不在本地。这可能吗?

或者是local内部能够调用函数的函数,即"外部"那个local

我知道其中一个论点是错误的,但我不记得其中哪一个和为什么。有人可以向我解释哪一个是正确的为什么

(球拍)

3 个答案:

答案 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无法致电localBB无法致电localA

答案 1 :(得分:2)

在其封闭范围内创建嵌套的任何新范围。

enter image description here

范围区域中的任何标识符也位于封闭范围内,并且可以使用同一范围内的任何其他标识符或其封闭范围。

enter image description here

您不能在其范围之外使用标识符;但你可以使用它引用的,从该内部范围返回该值"向上"。

enter image description here

答案 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保留了词法范围,因此nhelper可以从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)完成其事后调用。