Sta*_*lin 7 lisp scheme arguments functional-programming function
我开始学习具有Java背景的Lisp.在SICP的练习中,学生应该创建具有许多参数的抽象函数,例如
(define (filtered-accumulate combiner null-value term a next b filter)...)
Run Code Online (Sandbox Code Playgroud)
在运动1.33.在Java(具有安全,静态类型规则的语言)中 - 一个包含4个以上参数的方法通常会闻起来,但是在Lisp/Scheme中它没有,是吗?我想知道你在函数中使用了多少个参数?如果你在生产中使用它,你会制作多少层吗?
Rai*_*wig 13
SICP使用Scheme的子集
SICP是一本用于计算机科学入门课程的书.虽然它解释了一些高级概念,但它使用非常小的语言,Scheme语言的子集以及典型实现提供的任何现实世界Scheme或Lisp的子子集.使用SICP的学生应该从一种简单易学的语言开始.从那里他们学习实现更复杂的语言添加.
普通教育计划只使用位置参数
例如,在SICP中没有开发宏.添加标准Scheme确实只有函数的位置参数.
Lisp和Scheme提供了更具表现力的参数列表
在"真正的"Lisp或Scheme中,可以使用以下一个或多个:
对象或记录/结构(穷人的封闭)将事物分组.传递的对象可以包含多个数据项,否则需要传递"传播".
可选变量的默认值.因此,我们只需要传递那些我们想要具有某个非默认值的那些
可选和命名参数.这允许灵活的参数列表更具描述性.
计算参数.可以基于其他参数计算参数的值或默认值
上面导致编写函数接口更复杂,但通常更容易使用.
在Lisp中,为参数提供描述性名称并为界面提供在线文档是一种很好的方式.开发环境将显示有关功能界面的信息,因此此信息通常只是一次击键或甚至自动显示.
对于任何非平凡的接口来说,这也是一个很好的风格,它应该由用户/开发人员以交互方式使用,以便在运行时检查其参数.
复杂但可读的参数列表的示例
当有更多参数时,Common Lisp提供命名参数,它可以在普通参数之后以任何顺序出现.命名参数也提供默认值,可以省略:
(defun order-product (product
&key
buyer
seller
(vat (local-vat seller))
(price (best-price product))
amount
free-delivery-p)
"The function ORDER-PRODUCT ..." ; documentation string
(declare (type ratio vat price) ; type declarations
(type (integer 0) amount)
(type boolean free-delivery-p))
...)
Run Code Online (Sandbox Code Playgroud)
我们会用它然后:
(order-product 'sicp
:seller 'mit-press
:buyer 'stan-kurilin
:amount 1)
Run Code Online (Sandbox Code Playgroud)
上面使用seller参数前的buyer参数.它还省略了各种参数,其中一些参数的值已计算出来.
现在我们可以问这些广泛的论点是好还是坏.对他们的论点:
几个Scheme实现采用了类似的参数列表.
| 归档时间: |
|
| 查看次数: |
2161 次 |
| 最近记录: |