功能

函數是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 包裝工作,以便恢復使用者的狀態。