函数的参数太多了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的参数太多了相关的知识,希望对你有一定的参考价值。

我开始学习具有Java背景的Lisp。在SICP的练习中,学生应该创建具有许多参数的抽象函数,例如

 (define (filtered-accumulate combiner null-value term a next b filter)...)

exercise 1.33。在Java(具有安全,静态类型规则的语言)中 - 一个包含4个以上参数的方法通常会闻起来,但是在Lisp / Scheme中它没有,是吗?我想知道你在函数中使用了多少个参数?如果你在生产中使用它,你会制作多少层吗?

答案

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))
  ...)

我们会用它然后:

(order-product 'sicp
               :seller 'mit-press
               :buyer  'stan-kurilin
               :amount  1)

上面在sellerargument之前使用buyer参数。它还省略了各种参数,其中一些参数的值已计算出来。

现在我们可以问这些广泛的论点是好还是坏。对他们的论点:

  • 函数调用更具描述性
  • 函数具有附加文档的标准机制
  • 可以询问函数的参数列表
  • 类型声明是可能的 - >因此类型不需要写为注释
  • 许多参数可以具有合理的默认值,不需要提及

几个Scheme实现采用了类似的参数列表。

以上是关于函数的参数太多了的主要内容,如果未能解决你的问题,请参考以下文章

在堆栈上分配 16kb 是否太多了?

JS中有多少Vars太多了? [关闭]

封装函数的3个设计技巧

CAD LISP编译成VXL时提示错误参数太多 怎么解决

图片:“给你五十行代码把我变成字符画!” 程序:“太多了,一半都用不完!”

functools下的partial模块应用