четверг, 10 февраля 2011 г.

Синтаксис и семантика Лиспа


Синтаксис языка Лисп настолько прост, что некоторые обычно говорят, что у Лиспа нет синтаксиса совсем. Но лично я, с этим не соглашусь, синтаксис все же есть. Весь синтаксис Лиспа состоит из так называемых S-expressions (или иногда их называют префиксной нотацией). В общем виде, это выглядит как:


(operator arg1 arg2 arg3 ...)

То есть, сначала идет оператор, далее идут аргументы. Давайте рассмотрим простенький пример:


(+ 1 2 3)

вернет результат равный 6-ти.

Также, выражения могут быть вложены друг в друга:


(+ 1 2 (* 3 4))

вернет результат равный 15-ти.

Понятно, что каждый оператор обладает определенной семантикой. Но что делать, если нет оператора с необходимой нам семантикой? Мы можем определить свой оператор путем объявления новой функции. Допустим, нам не хватало оператора возведения числа в квадрат. Мы можем объявить свою функцию возведения в квадрат числа:


(defun sqr (a)
(* a a))

Так, мы можем объявлять свои функции. Давайте посмотрим на общий синтаксис объявления функции:


(defun name (arg1 arg2 arg3 ...)
body)


где, name - имя функции, arg1, arg2, arg3 - аргументы и body - тело функции.



В каком-то смысле, программу на Лиспе можно представить как одно очень большое s-выражение, где одни выражения вложены в другие. Но имея в своем арсенале функции мы можем сделать декомпозицию кода, то есть разбить весь код программы на небольшие функции, где каждая функция выполняет свою определенную цель.

Комментариев нет:

Отправить комментарий