•过程调用表达式
语法:(<operator> <operand1> ...)
过程调用也称为组合排列
相对Lisp其他方言,Scheme的求值顺序并没有规定,并且操作子表达式和操作数表达式总是以相同的计算规则进行计算。
尽管没有规定求值顺序,操作子和操作数表达式的并行计算影响被限制为与其他序列的求值顺序一致。每个过程调用可以选择不同的求值顺序。
在Lisp的许多方言中,空排列组合()是一个合法表达式。但在Scheme, 排列组合中必须至少有一个表达式,因此,()不是一个语法有效的表达式。
guile> (+ 3 4)
7
guile> ((if #f + *) 3 4)
12
> (do ((i 1 (+ i 1)) (j 1 (+ j 1)) (k 1 (+ k 1))) ((and (> j 4) (> i 10) (> i 20))) ((lambda (x) (display x) (newline)) j))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $81 = unspecified在上面例子中,do循环内部也是一种调用方式:这里定义了一个匿名函数
(lambda (x) (display x) (newline))接受1个参数,直接输出&换行。
直接将这个匿名函数作为参数,包括函数需要传入的参数传入,这样调用:
((lambda (x) (display x) (newline)) j)
这种调用方式等价于:
> (define fx (lambda (x) (display x) (newline))) $86 = (lambda ?? (x)...) > (fx 100) 100 $87 = #t
> (do ((lst (list 1 2 3 4 5 6) )) ((<= (length lst) 0)) (display (car lst)) (newline) (set! lst (cdr lst))) 1 2 3 4 5 6 $5 = unspecified
> (do ((lst (list 1 2 3 4 5 6) (set! lst (cdr lst)) )) ((<= (length lst) 0)) (display (car lst)) (newline)) 1 2 3 4 5 6 $6 = unspecified
> (define lst (list 1 2 3 4 5 6)) $7 = (1 2 3 4 5 6) > (do () ((<= (length lst) 0)) (display (car lst)) (newline) (set! lst (cdr lst))) 1 2 3 4 5 6 $8 = unspecified