Функции

Функции — это основная концепция 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 (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-push и lumi-context-pop, чтобы восстановить состояние пользователя.