功能

函数是Scheme 中的核心概念,提供封装逻辑、实现代码重用和有效构建脚本的方法。通过函数,您可以创建模块化、可维护的脚本来处理各种任务,从基本操作到 Lumi 中的高级工作流程。

本节介绍了Scheme中的函数,并为理解它们的类型、定义和用途奠定了基础。后续部分将更深入地研究特定的函数类型及其独特的功能。

最小语法和表达式

方案代码由表达式组成。表达式计算出一个值。语法是统一的:括号形成调用,运算符或函数名称在前。

(+ 1 2)         ; Adds 1 and 2, resulting in 3
(if #t 1 0)     ; Evaluates to 1 because the condition is true
(list 1 2 3)    ; Creates a list: (1 2 3)

因为一切都是表达式,所以控制流自然地适合与函数调用相同的风格。

为什么函数很重要

函数在Scheme中发挥着关键作用,原因如下:

  • 代码可重用性: 通过将逻辑封装到可重用组件中来避免重复。
  • 模块化: 将复杂的任务分解为更小的、可管理的部分。
  • **动态行为:**接受参数来处理各种输入或适应不同的情况。
  • 更高的抽象: 通过关注函数“做什么”而不是“如何”来简化逻辑。

函数类型概述

Scheme 提供了多种函数构造,每种构造都适合特定的用例:

  1. 命名函数 这些是使用 define 定义的标准函数。它们构成了大多数脚本的支柱。

    (define (square x)
      (* x x))
  2. 匿名函数 也称为 lambda 函数,这些是内联定义的未命名函数,供一次性使用。

    (lambda (x) (* x x))
  3. 高阶函数 将其他函数作为参数或返回函数作为结果的函数,支持强大的抽象,例如映射、过滤和归约。

    (map (lambda (x) (* x x)) '(1 2 3 4))  ; Returns (1 4 9 16)

函数的通用语法

Scheme 中的函数具有简单且一致的语法:

(define (function-name parameter1 parameter2 ...)
  body-expression)
  • function-name: 函数的名称。
  • parameter1, parameter2, ...: 函数采用的参数。
  • body-expression: 调用函数时执行的逻辑。

示例:

(define (add x y)
  (+ x y))

(add 3 5)  ; Returns 8

副作用和全局状态

在 Lumi 中,许多有用的过程都有副作用:它们修改图像、更改可绘制对象、写入文件或显示输出。

  • 将副作用隔离在小的、名称明确的程序中。
  • 除非需要,否则避免更改全局上下文。
  • 当您更改上下文(颜色、画笔等)时,请使用 lumi-context-pushlumi-context-pop 包装工作,以便恢复用户的状态。