picolisp.ru
Переключить темный/светлый/авто режим Переключить темный/светлый/авто режим Переключить темный/светлый/авто режим Back to homepage

60 функций PicoLisp. Часть 1: Арифметика

Перевод. Оригинал здесь

"Если бы я начал учиться заново, то я последовал бы совету Платона и начал с математики" (Галилео Галилей).

Это перевод четвёртой статьи из цикла Введение в PicoLisp. В серии "60 функций PicoLisp" будут рассмотрены самые базовые функции языка PicoLisp. К концу цикла вы узнаете о более, чем 60 самых часто употребляемых функций языка, которые будут прочным фундаментом для любых ваших программ в дальнейшем.

Для того, чтобы вы могли выполнять примеры из этой серии, вам сначала придётся изучить, как работает REPL.

PicoLisp REPL

В PicoLisp встроена оболочка для выполнения команд, так называемая REPL (от слов Read-Eval-Print-Loop, то есть "прочитать команду - выполнить - вывести ответ - начать заново"). Такая оболочка позволяет в интерактивном режиме опробовать функции и синтаксис языка.

REPL запускается командой:

pil +

Восле ввода этой команды в терминале вы увидите двоеточие (:), появившееся на новой строке. Оно приглашает вас ввести команду:

user@my-computer1234$ pil +
:

Чтобы выйти из REPL, введите команду (bye) или нажмите сочетание клавиш Ctrl+D.

Если вы хотите прекратить ввод команды и начать вводить новую, а REPL продолжает ждать окончания ввода предыдущей - так же нажмите Ctrl+D.

Если вы хотите прервать выполнение запущенной команды (например, если она вошла в бесконечный цикл), нажмите сочетание клавиш Ctrl+С.

Базовый синтаксис

Первое, что заставляет обратить на себя внимание в программах на LISP/PicoLisp, это обилие круглых скобок (квадратные и фигурные скобки почти не используются). Их много, как минимум одна в строке, а то и целая вереница, при этом остальной код достаточно лаконичен. Зачем они нужны?

Изучая LISP и его диалекты, вы будете часто встречаться с понятием S-выражений. Когда мы будем говорить о функциональных аспектах программирования на PicoLisp, мы остановимся на этих выражениях более подробно. Сейчас нам важно, что любая функция вызывается следующим образом:

: (myfunction arg1 arg2 arg3 ...)

Arg1, Arg2 и Arg3 могут быть как данными, так и функциями (их вызов нужно заключать в круглые скобки). Такой синтаксис делает возможным использование вложенных конструкций:

: (myfunction arg1 (myfunction2 arg2 arg3))

Отступы и переходы на новую строку не важны интерпретатору, но помогают сделать код более читаемым:

(myfunction arg1 
      (myfunction2 arg2 arg3)  )

По соглашению о правилах написания кода закрывающие скобки располагаются в последней строке выражения, а не на новой строке. Вложенные функции отмечаются увеличением отступа.

Комментарии в коде начинаются со знака решётки (#):

# Это комментарий.

Базовые арифметические функции

Наверное самыми базовыми функциями в любом языке программирования являются арифметические: сложение, вычитание, умножение и деление. Как и следует ожидать, для их вызова используются символы +, -, * и /.

Давайте используем знания, которые только что усвоили, на практике. Напишем список из оператора и нескольких аргументов:

: (+ 3 3)
-> 6

Как и ожидалось, выражение (+ 3 3) вычисляется в 6. Давайте попробуем более сложный пример: 4*(3+5).

: (* 4 (+ 3 5))
-> 32

Выражение вычисляется справа налево, начиная с внутренних скобок. Конечно, от перестановки местами множителей и слагаемых резульрат не поменяется. Следующее выражение будет давать такой же результат:

: (* (+ 5 3) 4)
-> 32

Для возведения в степень используйте оператор **:

(** 2 4)
-> 16

Оператор % возвращает остаток от деления:

: (% 17 5)
-> 2
: (% -17 5)  # Sign is that of the first argument
-> -2

Инкремент и декремент

Инкрементом называется увеличение значения на единицу. Декрементом, соответственно - уменьшение на единицу. Для этого в PicoLisp испоьзуются функции inc и dec:

: (inc 4)
-> 5
: (inc (* (+ 3 5) 4))
-> 33
: (dec( inc (* (+ 3 5) 4)))
-> 32

Сравнение чисел

Для сравнения чисел используются стандартные операторы: = (равно), > (больше), >= (больше или равно), < (меньше), <= (меньше или равно). Эти операторы возвращают истину (T), если выражение верное, либо NIL, если не верное:

: (< 3 4)
-> T
: (< 4 3)
-> NIL

Также в PicoLisp есть функции для сравнения чисел с нулём. Меньше нуля: lt0, меньше или равно нулю: le0, больше нуля: gt0, больше или равно нулю: ge0 и, наконец, равно нулю: =0.

: (ge0 3)
-> T
: (le0 3)
-> NIL

abs возвращает абсолютное значение:

: (abs -3)
-> 3

rand генерирует псевдослучайное число. Опционально для функции rand можно задать диапазон, в котором будут генерироваться числа:

: (rand)
-> -1669437588

# Случайное число в диапазоне от 1 до 10
: (rand 1 10)
-> 7

Если вы поэксериментируете с вычислениями, то заметите, что PicoLisp всегда возвращает в качестве результата целое число. Это вызвано тем, что PicoLisp работает с числами с фиксированной точкой. Что это означает и как с этим справиться - будет рассказано в одной из следующих публикаций.