这个Scheme代码是什么意思? (' list'运算符使用lambda的定义)

时间:2015-09-15 04:20:15

标签: lambda scheme racket

作为编译并返回参数列表的list运算符的定义,我在this tutorial找到了这个方案代码

(define list
(lambda args args))

但是,这与我所知道的通常的lambda语法不匹配。我的意思是,lambda应该在括号中有参数等。请解释这是如何工作的。

3 个答案:

答案 0 :(得分:4)

虽然lambda中的一般形式的参数似乎总是包括括号,但它并不一定是必需的。如果查看this section中的The Scheme Programming Language 4e,则会说:

  

lambda的一般形式比我们之前看到的形式要复杂一点,因为形式参数规范(var ...),不一定是一个正确的列表,或者甚至是一个列表所有即可。形式参数规范可以采用以下三种形式中的任何一种:

     
      
  1. 一个适当的变量列表,(var1 ... varn),例如我们已经看到的,
  2.   
  3. 单个变量var n
  4.   
  5. 一个不正确的变量列表,(var1 ... varn.varr)。
  6.         

    在第一种情况下,必须提供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&hellip; <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>)。