Scheme 球拍如何处理(定义(f(x y))身体)?

Scheme 球拍如何处理(定义(f(x y))身体)?,scheme,lisp,racket,Scheme,Lisp,Racket,我在学习球拍,并写下了这个定义: (define y 2) (define (f (x y)) (print x) (print y)) 当我计算(f1)时,x绑定到1,而y绑定到2。这对我来说似乎很奇怪。这个表达式是如何展开的?解释器如何处理这个问题?这是一个可选参数 Racket中定义的语法在文档中 我的大部分口齿不清是在Common Lisp中,方括号不是括号,所以我最初误读了语法。关于[arg id default expr]的部分意味着您可以有一个带有默认值的可选参数。所以

我在学习球拍,并写下了这个定义:

(define y 2)
(define (f (x y))
  (print x)
  (print y))
当我计算
(f1)
时,
x
绑定到
1
,而
y
绑定到
2
。这对我来说似乎很奇怪。这个表达式是如何展开的?解释器如何处理这个问题?

这是一个可选参数 Racket中定义的语法在文档中

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

(define (f (x y)) …)
f
定义为接受0或1个参数的过程。如果未提供参数,则其默认值为
y
。这就是为什么当您对
y
有一个早期定义时,这种方法会起作用。这也意味着您可以调用
(f)
,您应该可以看到打印的
y
的值:

这是罗比·芬德勒(Robby Findler)和托尼·加诺克·琼斯(Tony Garnock Jones)在帖子中在“球拍用户”邮件列表中向我指出的

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

定义在某些(但不是所有)上下文中是有效的 是允许的。它们仅在和的顶层有效 在一场战争的开始

定义应具有以下形式之一:

(define <variable> <expression>)
(define (<variable> <formals>) <body>)
(定义)
(定义())
应该是零个或多个变量的序列,或者 一个或多个变量的序列,后跟空格分隔的句点 和另一个变量(如lambda表达式)。这张表格是 相当于

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

(define (<variable> . <formal>) <body>)
(define <variable>
  (lambda <formal> <body>)).
(定义
(lambda())。
(定义()
应该是单个变量。此表格相当于

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

(define (<variable> . <formal>) <body>)
(define <variable>
  (lambda <formal> <body>)).
(定义
(lambda))。
Racket博士不会接受你用R5RS语言所作的定义:


在Racket中,参数可以定义为
(参数名称默认值)
(通常使用方括号,但这只是风格的问题-语言本身并不关心)


所以
(define(f(x y))…)
定义了一个函数
f
,该函数接受一个名为
x
的参数,其默认值为
y

@JoshuaTaylor哦,我正在使用一个Racket解释器,这种情况确实发生了。Racket应用程序支持很多语言。您使用哪种语言支持这种语法?不完全重复,但肯定相关:。它询问有关
(define((func x)y)
之类的问题。感谢您的提醒,我非常感谢您的患者。您是对的。对不起,我的错误,我担心我在我的环境中键入的内容太多,
y
可能已经定义了某个地方……好吧,如果
y
是一个过程,请尝试调用
(y)
,并找出它是什么。:)如果我先定义y,这个问题仍然困扰着我:
(定义y 1)(定义f(x y))(打印x)(打印y))
(f 1)
。它和球拍有关吗?因为它不在R5RS标准中。说
(f1)
仍在工作本身并不意味着什么。它有什么作用?