我知道我无法在一个表达式中定义一个函数,但我在同一个嵌套函数中的表达式之后定义了一个的错误。我在DrScheme上使用R5RS。
例如,这会引发错误,' define:表达式上下文中不允许' :
(define (cube x)
(if (= x 0) 0) ;just for example, no reason to do this
(define (square x) (* x x))
(* x (square x)))
答案 0 :(得分:4)
在R5RS中,您只能在相当具体的位置使用define
:特别是您可以在具有<body>
的表单的开头(仅)使用它。这在5.2.2中描述。这尤其意味着内部define
在任何其他表达式之后永远不会发生,即使在<body>
中也是如此。
原生球拍(或者你用#lang racket
得到的正确名称)在这方面更加灵活:你要做的是什么(除了单臂if
)在Racket合法。
答案 1 :(得分:1)
你可以在另一个定义中使用define
。但是,有些方案不允许您拥有if
而没有else
部分。这对我有用:
(define (cube x)
(if (= x 0) 0 1) ; just for example, no reason to do this
(define (square x) (* x x))
(* x (square x)))
你有没有尝试过一开始的定义?也许这可能是你的口译员的问题。
答案 2 :(得分:1)
define
(包括所有用于程序的语法糖形式,如let
,let*
和letrec
)仅在其他表达式之前合法并且从不在第一个表达之后,它不能是最后一个表格。
您的示例没有说明为什么您希望在定义之前拥有表达式的真正原因。除了将所有define
移到开头之外,你无法获得更多的东西。例如。
(define (cube x)
;; define moved to top
(define (square x) (* x x))
;; dead code moved under define and added missing alternative
(if (= x 0) 0 'undefined)
(* x (square x)))
如果代码没有死。例如。它是尾部表达式,您可以使用let
来创建一个新的主体:
(define (cube x)
(if (= x 0)
0
(let ()
;; this is top level in the let
(define (square x) (* x x))
;; required expression
(* x (square x)))))
我想也许我们需要一个例子,你认为在表达式后面有定义是有理由的,我们很乐意展示如何设计它。