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)
仍在工作本身并不意味着什么。它有什么作用?