Scheme 过程调用表达式

 

•过程调用表达式
语法:(<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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值