误差在球拍定义(Error with define in Racket)

2019-09-01 03:51发布

我刚刚发现球拍前几天,我试图通过编写生成图像使用来表示源代码的小脚本,以获得更多的舒服#lang slideshow

我知道,在功能范式编程时,它是很好的做法,以创建几乎所有与变量let ,但我发现它引入了嵌套和球拍的让有需要多余的括号内过于复杂的API层次太多。 我敢肯定,这是使用时取出歧义let更有力的方式,但对于我而言,它只是一个烦恼。 因此,我创建我的所有变量define ,并用写块begin ,如果我需要(如在体内if语句)。

问题是,我已经多次被得到什么似乎是很奇怪的错误。 我敢肯定,我只是做了一些愚蠢的初学者的错误,是新来的语言,但我真的似乎无法找到投诉的来源。

这里是有问题的代码:

(define sub-code (foldr ht-append (rectangle 0 0) (map internal-style (rest code))))

虽然我们正在定义sub-code来似乎相当无关。 如果我将其替换为

(define sub-code '())

我收到了同样的错误。 DrRacket是说, define在表达式上下文中被使用。 我明白这是什么错误通常意味着- IE浏览器,当你写这样的代码,将提高(print (define x 10))但我看不出有什么会在这里引发的。

如果有帮助,这个define是在年初begin块,内部if语句

(if (list? code)
    (begin
        (define sub-code '())
        ; a few more define statements and finally an expression ))

特定错误消息DrRacket正在打印是

define: not allowed in an expression context in: (define sub-code (quote ()))

我想,也许define不允许在begin块,但我查了文档和例子一begin

(begin
    (define x 10)
    x)

所以,我真的不知道该怎么办。 提前致谢!

Answer 1:

定义是在允许的“身体”背景下,像lambdalet等等。 的结果和候补子句if不是身体的上下文; 他们表达语境,因此定义是不允许的。

begin是特别的- begin在身体情况允许的定义,但begin在一个表达式上下文禁止定义。 你的情况属于中后期。

例如:

(define (foo . args)     #| body context #|)
(define foo (lambda args #| body context |#))
(define (foo . args)
  (let (...)
    #| body context |#))

语法关键字,需要表达: if, cond, case, and, or, when, unless, do, begin 。 退房的形式语法中的任何计划报告(R {4,5,6,7} RS); 找<body> <sequence><command> ,和<expression>

另外,如果你需要在表达式中体范围内,只是包装一个let语法形式,因为这样的:

(if test
    (let ()
      (define foo 'foo)
      (list foo foo))
    alternate)


Answer 2:

作为GoZoner解释的,你不能使用define表达式上下文。

你该怎么办呢?

使用let

(if (list? code)
    (let ([x '()])
      x)
    ...

或将与“空”的工作let define

(if (list? code)
    (let ()
      (define x '())
      x)
    ...

但是,这是一个有点傻。

或者使用conddefine

(cond [(list? code)
       (define x '())
       x]
      ...

这最后一种方法-使用conddefine -是最接近什么当前球拍风格指南建议。



Answer 3:

这里有更多的细节,从球拍文档。

在不同的情况下是必需的,因为宏必须扩大不同,这取决于语言形式是允许的。

正如其他人所说,定义不表达语境(在docs“EXPR ...”)允许的,但在其他情况下确定。

在其它文档条目中,“身体...”表示内部清晰度上下文( 导向 , 参考 ),例如,在拉姆达机构,以及“形式...”表示所有的非表达的上下文,如在该文档为开始。



Answer 4:

或者你可以包裹表达式(开始)如(开始(定义×10)(定义; Y 100)(定义ž1000))



文章来源: Error with define in Racket