作为编译并返回参数列表的list运算符的定义,我在this tutorial找到了这个方案代码
(define list
(lambda args args))
但是,这与我所知道的通常的lambda语法不匹配。我的意思是,lambda应该在括号中有参数等。请解释这是如何工作的。
答案 0 :(得分:4)
虽然lambda中的一般形式的参数似乎总是包括括号,但它并不一定是必需的。如果查看this section中的The Scheme Programming Language 4e,则会说:
lambda的一般形式比我们之前看到的形式要复杂一点,因为形式参数规范(var ...),不一定是一个正确的列表,或者甚至是一个列表所有即可。形式参数规范可以采用以下三种形式中的任何一种:
- 一个适当的变量列表,(var1 ... varn),例如我们已经看到的,
- 单个变量var n 或
- 一个不正确的变量列表,(var1 ... varn.varr)。
醇>在第一种情况下,必须提供n个实际参数,并且每个变量都绑定到相应的实际参数。 在第二个中,任意数量的实际参数都是有效的;所有实际参数都放在一个列表中,单个变量绑定到此列表。
粗体的部分(由我设置的粗体)是与您的问题非常相关的部分。正如您的教程所说,这是一个转换为列表的varargs参数。
答案 1 :(得分:3)
这定义了至少为零的参数的可变参数过程(一个可以采用不同数量参数的过程)。在这种情况下,所有参数都捆绑在一个名为 <script>
function companyFormValidation()
{
var name = document.getElementById('companyname').value;
var title = document.getElementById('companytitle').value;
var desc = document.getElementById('description').value;
var logo = document.getElementById('logo').value;
var email = document.getElementById('emailid').value;
var website = document.getElementById('siteurl').value;
var phonenumber = document.getElementById('phonenumber').value;
var faxNumber = document.getElementById('faxNumber').value;
var address = document.getElementById('address').value;
var latitude = document.getElementById('latitude').value;
var longitude = document.getElementById('longitude').value;
if(name == '')
{
alert('Name can not empty');
//$("#ename").html("Name can't be empty..");
return false;
}
}
</script>
<form id="addCompanyForm" method="post" action="#" onsubmit="return companyFormValidation()" class="form-horizontal" >
<fieldset>
<legend>Company </legend>
<div class="form-group">
<label class="col-lg-3 control-label">Name</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="companyname" id='companyname' />
<div id="ename"></div>
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Title</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="companytitle" id="companytitle" />
<div id="etitle"></div>
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Description</label>
<div class="col-lg-5">
<textarea class="form-control" name="description" id = "description"></textarea>
<div id="edesc"></div>
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Logo</label>
<div class="col-lg-5">
<input type="file" class="form-control" name='logo' id="logo" >
<!-- <span class="input-group-btn">
<span class="btn btn-default btn-file">
Browse… <input type="file" name="">
</span>
</span> -->
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Email </label>
<div class="col-lg-5">
<input type="text" class="form-control" name="emailid" id="emailid"/>
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Website</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="siteurl" placeholder="http://" id="siteurl" />
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Phone number</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="phonenumber" id="phonenumber"/>
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Fax number</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="faxNumber" id="faxNumber" />
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Address</label>
<div class="col-lg-5">
<textarea class="form-control" name="address" id="address"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Latitude</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="latitude" id="latitude" />
</div>
</div>
<div class="form-group">
<label class="col-lg-3 control-label">Longitude</label>
<div class="col-lg-5">
<input type="text" class="form-control" name="longitude" id="longitude" />
</div>
</div>
</fieldset>
<div class="form-group">
<div class="col-lg-9 col-lg-offset-3">
<button type="submit" class="btn btn-primary" >Submit</button>
</div>
</div>
</form>
的列表中。
这是变量过程的另一个例子(这个至少需要一个参数),它返回传入的所有参数的最小值:
args
答案 2 :(得分:0)
Scheme解释将形式参数规范与函数调用中提供的实际参数配对,从而进行一种受限模式匹配,形式参数规范作为模式的一种。
当它是长度为n
的正确列表时,这就像说,会将每个n
提供的参数值绑定到规范中的每个变量 。 Scheme要求在这种情况下提供完全n
个参数,尽管可以想象某些方言在这种函数调用中允许比n
参数更多或更少,而不会导致错误:
(define mylist (lambda (x y) ; (define (mylist x y) ; exactly two
(list x y))) ; (list x y)) ; arguments required
当它是带有n
变量和一个尾部变量的不正确列表时,这就像说如果给出超过n
个参数,则将其余部分作为列表绑定到那个尾部变量。如果没有更多的参数,自然会将一个空列表绑定到尾部变量:
(define mylist (lambda (x . y) ; (define (mylist x . y) ; at least one
(cons x y))) ; (cons x y)) ; argument required
作为形式参数特定的唯一变量被标识为不正确列表的尾部变量,作为前一个案例的特定变体。因此,它将作为列表绑定到函数调用中提供的所有参数值:
(define mylist (lambda x ; (define (mylist . x) ; any number of
x)) ; x) ; arguments can be used
x
已经是一个包含所有提供的参数的列表。
很容易看出,所有三种情况都可以通过相同的代码转换来处理,
(define (translate-define-to-lambda code)
(list (car code) ; "define"
(caadr code) ; name
(cons 'lambda
(cons (cdadr code) ; parameters
(cddr code)))))
(因为(cdr '(<a> . <b>))
== <b>
)。