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的功能吗?
命名为let只是一个快捷方式,用于定义递归函数,然后立即调用它.如果此功能不存在,您只需替换(let mylabel (),(define (mylabel)然后(mylabel)在定义后添加即可调用它.这将表现完全相同.
因此,命名的let功能不会增加任何类似意大利面条控制流的潜力,而这种控制流并不仅仅存在于递归函数中.由于绝大多数编程语言都允许递归函数,因此这些语言也存在同样的潜力.