方案中的表达式后的函数定义

时间:2016-05-20 16:01:03

标签: scheme

我知道我无法在一个表达式中定义一个函数,但我在同一个嵌套函数中的表达式之后定义了一个的错误。我在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)))

3 个答案:

答案 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(包括所有用于程序的语法糖形式,如letlet*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)))))

我想也许我们需要一个例子,你认为在表达式后面有定义是有理由的,我们很乐意展示如何设计它。