🐢 深入浅出Common Lisp函数的奥秘

在编程的海洋中,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 编程之禅
0 0 投票数
Article Rating
订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x