🐢 深入浅出Common Lisp函数的奥秘 2024-10-04 作者 C3P00 在编程的海洋中,Common Lisp就像一只悠然自得的海龟,缓慢却坚定地游向知识的彼岸。在这篇文章中,我们将一起探索Common Lisp函数的定义、参数以及高阶函数等内容,确保每位读者都能在这片代码的海洋中畅游自如。 ✍️ 定义新函数 在Common Lisp中,定义一个新函数就像给你的程序添置一个新工具,它将帮助你完成特定的任务。使用defun宏来定义函数,其基本结构如同一个简洁的说明书: (defun name "一些说明文字" body-form*) 举个例子,我们来定义一个简单的“Hello, World”函数: (defun hello-world () "打印Hello, world" (format t "Hello, world")) 在这个例子中,hello-world是函数名,()表示这个函数不需要参数,而(format t "Hello, world")则是函数体,它的使命就是向标准输出打印“Hello, world”。 📦 函数形参列表 形参列表就像是函数的邀请函,只有接受了这些邀请,函数才能顺利运行。在定义函数时,形参列表用于声明一些变量来接收传递给函数的实际参数。普通的形参列表要求每一个必要参数都必须提供实参,否则函数会婉拒执行。 可选形参 有时候,实参数可能少于形参数,这时可选形参就派上用场了。通过在必要形参后使用&optional,未赋值的形参可以用默认值填充。比如: (defun foo (a b &optional c d) (list a b c d)) 这个函数可以这样调用: (foo 1 2) ; -> (1 2 NIL) (foo 1 2 3) ; -> (1 2 3 NIL) (foo 1 2 3 4); -> (1 2 3 4) 如果想为可选形参提供默认值,只需这样写: (defun foo (a b &optional (c 10)) (list a b c)) 这样调用(foo 1 2)时,c会默认取值10。 🌊 剩余形参 当你需要传递多个参数时,剩余形参就能派上用场。通过在必要和可选形参后使用&rest,所有后续的实参将被收集到一个列表中。比如: (defun + (&rest numbers) ...) 这意味着你可以传递任意数量的参数,函数会将它们整理成一个列表。 🔑 关键字形参 如果你只想为某些参数提供值,关键字形参将是一个完美的解决方案。在必要和可选形参之后,使用&key来定义关键字形参,比如: (defun foo (&key a b c) (list a b c)) 这样调用(foo :a 1 :b 2)时,它会返回(1 2 NIL),方便快捷。 🌀 混合不同的形参类型 在一个函数中,你可以灵活地混合不同类型的形参。常见的组合是必要形参和可选形参,或者是&optional和&rest的组合。顺序上,必要形参应该放在前面,后续可以添加可选、剩余和关键字形参。使用关键字形参可以让你的代码更加易于维护和扩展。 🔄 函数返回值 在Common Lisp中,函数的返回值默认是最后一个表达式的值,也可以使用return-from语句在任何位置返回值。例如,下面的函数寻找一个数对,要求每个数都小于10,并且它们的乘积大于参数n: (defun foo (n) (dotimes (i 10) (dotimes (j 10) (when (> (* i j) n) (return-from foo (list i j)))))) 🎭 作为数据的函数——高阶函数 在Common Lisp中,函数不仅可以执行操作,还可以作为数据存储在变量中,甚至传递给其他函数。使用defun定义的函数实际上创建了一个新的函数对象并赋予其一个名字。你也可以使用lambda表达式创建匿名函数。例如: (funcall #'(lambda (x y) (+ x y)) 2 3) ; 返回5 🕵️♂️ 匿名函数 使用lambda创建匿名函数的语法如下: (lambda (parameters) body) 例如,创建一个匿名函数来增加两个数并调用它: (funcall #'(lambda (x y) (+ x y)) 2 3) ; 返回5 通过这些示例,我们可以看到Common Lisp的函数机制是多么强大与灵活。无论是定义函数、处理形参,还是使用高阶函数,Lisp都能让你如鱼得水,尽情地在编程的海洋里遨游。 📚 参考文献 编程之禅. (2021). Common Lisp函数. Retrieved from 编程之禅
在编程的海洋中,Common Lisp就像一只悠然自得的海龟,缓慢却坚定地游向知识的彼岸。在这篇文章中,我们将一起探索Common Lisp函数的定义、参数以及高阶函数等内容,确保每位读者都能在这片代码的海洋中畅游自如。
✍️ 定义新函数
在Common Lisp中,定义一个新函数就像给你的程序添置一个新工具,它将帮助你完成特定的任务。使用
defun
宏来定义函数,其基本结构如同一个简洁的说明书:举个例子,我们来定义一个简单的“Hello, World”函数:
在这个例子中,
hello-world
是函数名,()
表示这个函数不需要参数,而(format t "Hello, world")
则是函数体,它的使命就是向标准输出打印“Hello, world”。📦 函数形参列表
形参列表就像是函数的邀请函,只有接受了这些邀请,函数才能顺利运行。在定义函数时,形参列表用于声明一些变量来接收传递给函数的实际参数。普通的形参列表要求每一个必要参数都必须提供实参,否则函数会婉拒执行。
可选形参
有时候,实参数可能少于形参数,这时可选形参就派上用场了。通过在必要形参后使用
&optional
,未赋值的形参可以用默认值填充。比如:这个函数可以这样调用:
如果想为可选形参提供默认值,只需这样写:
这样调用
(foo 1 2)
时,c
会默认取值10。🌊 剩余形参
当你需要传递多个参数时,剩余形参就能派上用场。通过在必要和可选形参后使用
&rest
,所有后续的实参将被收集到一个列表中。比如:这意味着你可以传递任意数量的参数,函数会将它们整理成一个列表。
🔑 关键字形参
如果你只想为某些参数提供值,关键字形参将是一个完美的解决方案。在必要和可选形参之后,使用
&key
来定义关键字形参,比如:这样调用
(foo :a 1 :b 2)
时,它会返回(1 2 NIL)
,方便快捷。🌀 混合不同的形参类型
在一个函数中,你可以灵活地混合不同类型的形参。常见的组合是必要形参和可选形参,或者是
&optional
和&rest
的组合。顺序上,必要形参应该放在前面,后续可以添加可选、剩余和关键字形参。使用关键字形参可以让你的代码更加易于维护和扩展。🔄 函数返回值
在Common Lisp中,函数的返回值默认是最后一个表达式的值,也可以使用
return-from
语句在任何位置返回值。例如,下面的函数寻找一个数对,要求每个数都小于10,并且它们的乘积大于参数n
:🎭 作为数据的函数——高阶函数
在Common Lisp中,函数不仅可以执行操作,还可以作为数据存储在变量中,甚至传递给其他函数。使用
defun
定义的函数实际上创建了一个新的函数对象并赋予其一个名字。你也可以使用lambda
表达式创建匿名函数。例如:🕵️♂️ 匿名函数
使用
lambda
创建匿名函数的语法如下:例如,创建一个匿名函数来增加两个数并调用它:
通过这些示例,我们可以看到Common Lisp的函数机制是多么强大与灵活。无论是定义函数、处理形参,还是使用高阶函数,Lisp都能让你如鱼得水,尽情地在编程的海洋里遨游。
📚 参考文献