Bar*_*own 21
在看到你的其他一些问题的基础上,我认为你可能无法将你的头脑包含在一个功能语言(如Scheme)的核心概念中.
在你正在学习Scheme(新手)的级别,你编写的每个函数都有一个输入和一个输出,每个函数的主体都是一个表达式.表达式求值的值是由函数返回的.没有必要像在Java或C等命令式语言中那样明确地"返回"任何内容; 它恰好是评估表达式的直接后果.
函数体是单个表达式.它不像Java那样方法的主体由一系列指令组成:
do this
then do that
then do something else
then return something (maybe)
Run Code Online (Sandbox Code Playgroud)
Scheme函数评估单个表达式; 而已.这是一个简单的函数,它将5作为参数传递给任何数字:
(define (add5 x)
(+ x 5))
Run Code Online (Sandbox Code Playgroud)
函数的主体是(+ x 5),它只是一个要评估的表达式.x插入值,将+(加法)函数应用于x和5,并返回结果.
列表没有太大的不同.您只需要一个构造列表的表达式.已经提到了两个:如果已经拥有所有元素,list用于从头开始构建列表; cons用于将单个元素添加到现有列表中,并且通常以递归方式使用.
这是一个消耗数字n并构建列表的函数(n n-1 n-2 ... 0)
(define (makelist n)
(if (= n 0)
(list 0) ; base case. Just return (0)
(cons n (makelist (- n 1))))) ; recursive case. Add n to the head of (n-1 n-2 ... 0)
Run Code Online (Sandbox Code Playgroud)
在基本和递归的情况下,通过简单地评估使用其中一个列表构建函数的表达式来返回列表.
这是另一个例子.这个使用我们的add5函数为数字列表(lon)的每个元素添加5:
(define (add5list lon)
(if (null? lon)
`() ; base case: lon is empty. Return an empty list.
(cons (add5 (car lon)) (add5list (cdr lon))))) ; recursive case.
; Add 5 to the head of lon and prepend it to the tail of lon
Run Code Online (Sandbox Code Playgroud)
同样,基本和递归情况都是通过计算导致列表的表达式来返回列表.
要记住关于Scheme的关键是所有函数都返回一些东西,而这只是评估表达式的结果.Scheme函数的主体是单个表达式.
Bri*_*ndy 11
你可能只想:'(2 3 5 7 11)或者(list 2 3 5 7 11)?
您还可以通过指定元素和列表来构建列表,以将其添加到: (cons 2 (cons 3 '()))
这是从函数返回列表的示例:
(define returnlist
(lambda(a b c)
(cons a (cons b (cons c '())))
))
(returnlist 2 3 4)
Run Code Online (Sandbox Code Playgroud)
返回值将是列表: (list 2 3 4)
另一种不太知名的方法是:
> ((lambda x x) 2 3 5 7 11)
(2 3 5 7 11)
Run Code Online (Sandbox Code Playgroud)
也就是说,“列表”功能本身可以定义为:
> (define list (lambda x x))
Run Code Online (Sandbox Code Playgroud)