为什么在Racket中具有类似goto的功能?

rns*_*nso 1 scheme racket

Racket是一种高级功能语言.但是,似乎名为let的构造允许类似goto的功能并允许编写类似意大利面条的代码:

(define i 1)
(let mylabel ()
  (set! i (add1 i))
  (println "Doing something...")
  (when (even? i)
    (println "going to mylabel because i is even")
    (mylabel) )
  (when (= 0 (modulo i 3))
    (println "going to mylabel because i is divisible by 3")
    (mylabel) )
  (println "Doing something more ...")
  (when (= i 7)
    (println "going to mylabel because i is 7")
    (mylabel) )
  (when (> i 10)
    (println "ending because i is 10")
    )
  (println i)
  )
Run Code Online (Sandbox Code Playgroud)

这不是包含goto的功能吗?

sep*_*p2k 5

命名为let只是一个快捷方式,用于定义递归函数,然后立即调用它.如果此功能不存在,您只需替换(let mylabel (),(define (mylabel)然后(mylabel)在定义后添加即可调用它.这将表现完全相同.

因此,命名的let功能不会增加任何类似意大利面条控制流的潜力,而这种控制流并不仅仅存在于递归函数中.由于绝大多数编程语言都允许递归函数,因此这些语言也存在同样的潜力.