gpt4 book ai didi

scheme - Racket 如何处理(定义(f(x y))主体)?

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:36 24 4
gpt4 key购买 nike

我正在学习 Racket,并写下了这个定义:

(define y 2)
(define (f (x y))
(print x)
(print y))

当我评估 (f 1) 时,x 绑定(bind)到 1,而 y 绑定(bind)到2。这对我来说似乎很奇怪。这个表达式是如何扩展的?解释器用这个做什么?

最佳答案

可选参数

Racket 中定义的语法在文档中。

3.14 Definitions: define, define-syntax, ...

(define id expr)
(define (head args) body ...+)

head = id
| (head args)

args = arg ...
| arg ... . rest-id

arg = arg-id
| [arg-id default-expr]
| keyword arg-id
| keyword [arg-id default-expr]

我的大部分 Lisping 都是 Common Lisp,其中方括号不是圆括号,所以我最初误读了语法。关于 [arg-id default-expr] 的部分意味着你可以有一个带有默认值的可选参数。所以

(define (f (x y)) …)

f 定义为接受 0 或 1 个参数的过程。如果未提供参数,则其默认值为 y。这就是为什么当你有一个较早的 y 定义时它起作用的原因。这也意味着您可以调用 (f),并且您应该看到 y 打印的值:

enter image description here

Robby Findler 和 Tony Garnock-Jones 在 Racket 用户邮件列表中的主题 [racket] (define (f (x y)) body) when y has a previous definition 中向我指出了这一点.

在R5RS中是不合法的

这在 R5RS 方案中是不合法的。定义的定义在:

5.2 Definitions

Definitions are valid in some, but not all, contexts where expressions are allowed. They are valid only at the top level of a and at the beginning of a .

A definition should have one of the following forms:

(define <variable> <expression>)
(define (<variable> <formals>) <body>)

should be either a sequence of zero or more variables, or a sequence of one or more variables followed by a space-delimited period and another variable (as in a lambda expression). This form is equivalent to

(define <variable>
(lambda (<formals>) <body>)).

(define (<variable> . <formal>) <body>)

should be a single variable. This form is equivalent to

(define <variable>
(lambda <formal> <body>)).

Dr.Racket 不会接受您在 R5RS 语言中的定义:

Dr.Racket Screenshot

关于scheme - Racket 如何处理(定义(f(x y))主体)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24365591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com