funcall

Common Lisp 高阶函数学习笔记: function, funcall 和 apply...

孤街醉人 提交于 2019-12-07 21:49:58
Common Lisp 高阶函数学习笔记: function, funcall 和 apply 的用法 目录 0 概述 1 函数 function 的用法 2 函数 funcall 的用法 3 函数 apply 的用法 0 概述 高阶函数是 Lisp 的一大特色, 所谓的高阶函数就是把一个函数当做另一个函数的参数来用, 如果把普通的函数调用看做是在二维平面上的活动, 那么高阶函数就相当于增加了一个维度:可以把高阶函数看做在三维立体空间的活动. 一般来说, 编程语言需要这种机制, 因为这样可以为开发者提供更灵活更高级的结构抽象能力, 正如<实用 Common Lisp 编程>中所说: 在 C 语言中使用函数指针, Perl 使用子例程引用, Python 跟 Lisp 一样, C# 使用代理, Java 则使用反射和匿名类. 高阶函数的一个应用场景是通用排序, 比如 Lisp 的函数 sort , 调用形式如下: (sort '(6 2 5 3 7 0) #'>) 我们可以选择不同的比较函数(就是 #' 后面的 >), 这样的实现就比较灵活, 当我们想换一个比较函数, 如换成 < , 我们并不需要修改 sort 的代码, 只要新写一个 < 函数, 然后把它作为 sort 的参数传递进去就可以了. 另外回调函数和钩子也能够保存代码引用以便于以后运行. 1 函数 function 的用法

Lisp-Stat 翻译 —— 第三章 Lisp编程

拈花ヽ惹草 提交于 2019-12-06 21:24:20
第三章 Lisp编程 上一章我们使用了一些内建的Lisp函数和Lisp-Stat函数来运行一些有趣的运算。我们构建的表达式中的一些还是相当复杂的。当你发觉自己多次键入相同的表达式的时候(当然你使用的数据可能略微有些不同),你自然就想为这个表达式引入一些速记符,也就是说你想要定义自己的函数了。函数定义是Lisp编程的基础操作。第2.7节已经对这个主题给出了一个简单的介绍,现在是深入探索的时候了。在对如何定义一个Lisp函数进行一个简略的复习之后,我们将检验一些需要的技术以开发功能更强大的函数:状态求值、递归和迭代、局部变量、函数式数据、映射和赋值。 除了介绍定义函数的工具,本章也展示了一些Lisp编程常用编程技术和原则。尤其地,对于本章的大多数情况我都会使用函数式风格直至本章结束,目的是避免使用赋值方式改变变量的值(注:这里提到的原则也是函数式的目的之一,即函数可以使用外部变量,但在函数的整个执行过程中不对变量进行写操作,不破坏外部变量,这样的函数要非破坏性函数,反之叫破坏性函数,在《Practical Common Lisp》和《On Lisp》里你将接触大量的非破坏性函数和他们的破坏性版本,都有其各自的书写约定)。本章的开发严重依赖Abelson和Sussman的《 Scheme:计算机程序结构与解释》的 前两章。为了允许我们集中精力到编程过程本身

Why do we need funcall in Lisp?

巧了我就是萌 提交于 2019-11-27 13:39:31
Why do we have to use funcall to call higher order functions in Common Lisp? For example, why do we have to use: (defun foo (test-func args) (funcall test-func args)) instead of the simpler: (defun bar (test-func args) (test-func args)) Coming from a procedural background, I'm a bit surprised by that since the languages I'm more used to (e.g. Python, C#) don't need the distinction. In particular, on the source level at least, the C# compiler transforms it to something like func.invoke() . The only problem I see is that this would mean we couldn't call a global function test-func anymore

Why do we need funcall in Lisp?

扶醉桌前 提交于 2019-11-26 18:18:34
问题 Why do we have to use funcall to call higher order functions in Common Lisp? For example, why do we have to use: (defun foo (test-func args) (funcall test-func args)) instead of the simpler: (defun bar (test-func args) (test-func args)) Coming from a procedural background, I'm a bit surprised by that since the languages I'm more used to (e.g. Python, C#) don't need the distinction. In particular, on the source level at least, the C# compiler transforms it to something like func.invoke() . The