60 функций PicoLisp. Часть 1: Арифметика
Перевод. Оригинал здесь
"Если бы я начал учиться заново, то я последовал бы совету Платона и начал с математики" (Галилео Галилей).
Это перевод четвёртой статьи из цикла Введение в PicoLisp. В серии "60 функций PicoLisp" будут рассмотрены самые базовые функции языка PicoLisp. К концу цикла вы узнаете о более, чем 60 самых часто употребляемых функций языка, которые будут прочным фундаментом для любых ваших программ в дальнейшем.
Для того, чтобы вы могли выполнять примеры из этой серии, вам сначала придётся изучить, как работает 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 работает с числами с фиксированной точкой. Что это означает и как с этим справиться - будет рассказано в одной из следующих публикаций.