Arc (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:36, 8 июня 2016.
Arc
fraimed
Парадигма мультипарадигменный (функциональный метаязык)
Спроектировано Пол Грэм и Роберт Моррис
Печать дисциплины динамическая, сильная
Лицензия Perl Foundation's Artistic License 2.0
Портал: http://arclanguage.org/
Влияние
Anarki, HL

Arc — (произносится [ ɑːk ])это диалект языка Lisp, который разрабатывают Пол Грэм и Роберт Моррис. В двух словах Arc можно определить как предельно упрощённую версию Lisp, с мощной поддержкой макросов, позволяющей любые «грязные хаки» в стиле Lisp.

История

В 2001 году Пол Грэм анонсировал что он работает над новым диалектом лиспа, который назвал «Arc». За несколько лет, он написал несколько эссе, с описанием функций или целей языка, были написаны на Arc некоторые внутренние проекты компании Y Combinator, в частности веб-форум Hacker News, и программа агрегатор новостей.

В эссе Being Popular Грэм описывает некоторые из его целей своего языка. Заявлены такие цели как «Arc должен поддаваться хакингу» и «в нём должны быть хорошие библиотеки»; Грэм также заявил, что:

"Я не уйду далеко от истины, если скажу, что хакер, выбирает язык для написания программы, по крайней мере подсознательно, основывается на том, сколько символов ему придётся вводить. Если это не и не в точности, то, что думают хакеры, разработчикам языков не мешало бы действовать так, как будто это было бы так."

Пол Грэм указывает, что оригинальный Lisp Джона Маккарти был построен на основе небольшого набора «аксиом», и утверждает, что Arc должна быть построена таким же образом, даже если это означает, что язык не будет иметь возможностей, которые желательны для крупных организаций. В частности, Грэм считает, что объектная ориентация бесполезна, поскольку методы и модели ООП являются просто «хорошим дизайном», и он рассматривает возможности языка используемые для реализации ООП как частично ошибочные.

Среди программистов на Lisp споры вызывает вопрос, нужно ли, и насколько дополнять синтаксис S-выражений другими формами синтаксиса. Грэм считает, что дополнительные синтаксис следует использовать в тех ситуациях, когда чистые S-выражения были бы чересчур многословны, говоря: «Я не думаю, что мы должны фанатично выступать против введения в Lisp синтаксиса.» Грэм также считает, что проблемы эффективности должны быть решены путем предоставления программисту хорошего профайлера.

Первая публичная версия Arc была представлена 29 января 2008 года. Релиз вышел в форме .TAR архива, содержащего исходный код Arc для mzscheme. Учебник и дискуссионный форум также доступны. Форум является копией форума news.ycombinator.com и тоже написан на Arc. Эта реализация распространяется на условиях Artistic License 2.0 (разработанной для языка Perl).

Описание

Выражения

Программы на Arc состоят из выражений. Простейшие выражения — это числа и строки, они же являются значениями этих выражений.

 arc> 25
 25
 arc> "foo"
 "foo"

Списки

Некоторые выражения также могут быть заключены в списки выраженные виде скобок. При вычислении таких списков, вычисляются значения всех элементов слева направо, а затем первому (предположительно функции) передаются остальные. Результат вычисления списка — значение возвращенное функцией.

 arc> (+ 1 2)
 3

В этом примере cначала вычисляются элементы +, 1 и 2. Результат - функция плюс, 1 и 2 соответственно. Затем 1 и 2 передаются функции плюс, которая возвращает 3. 3 и есть результат вычисления всего выражения. Макросы позволяют сделать некоторый трюк, потому что они изменяют список перед тем, как его вычислить.

Вложенные списки

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

 arc> (+ (+ 1 2) (+ 3 (+ 4 5)))
 15

Расположение плюса перед числами даёт преимущество — "+" может принимать произвольное количество аргументов, а не только два.

 arc> (+)
 0
 arc> (+ 1) 
 1
 arc> (+ 1 2)
 3
 arc> (+ 1 2 3)
 6

Это оказывается очень удобным особенно при генерации кода, что является обычной вещью в Arc.

Идентификаторы

Диалекты Lisp наподобие Arc имеют тип данных, которого нет в большинстве языков — идентификаторы (symbols). Значением идентификатора не является сам идентификатор, как это происходит с числами и строками. Идентификаторы возвращают значение, которое им было присвоено.

Если присвоить foo значение 13, то foo возвратит 13 (а не foo):

 arc> (= foo 13)
 13
 arc> foo
 13

Можно отменить вычисление просто добавлением апострофа перед выражением. Таким образом 'foo возвратит идентификатор foo.

 arc> 'foo
 foo

Хотя аргументы вычисляются слева направо это не привело к ошибке при попытке вычислить foo потому что существуют операторы, которые нарушают обычное правило вычисления выражений, и = один из них. Первый аргумент = не вычисляется. Если поставить апостроф перед списком, то результатом будет сам список.

 arc> (+ 1 2)
 3
 arc> '(+ 1 2)
 (+ 1 2)

Первое выражение возвращает 3. Второе, т. к. оно «экранировано» апострофом, возвращает список, содержащей идентификатор + и два числа: 1 и 2.

Оператор cons

Список можно сконструировать с помощью cons, который возвращает список в новым элементом вначале:

 arc> (cons 'f '(a b))
 (f a b)

При этом исходный список не изменяется.

 arc> (= x '(a b))
 (a b)
 arc> (cons 'f x)
 (f a b)
 arc> x
 (a b)

Пустой список представляется идентификатором nil, который по определению вычисляется в себя. Таким образом, создать список из одного элемента можно так:

 arc> (cons 'a nil)
 (a)

Операторы car и cdr

Список можно разбить с помощью car и cdr, которые возвращают голову (первый элемент) и хвост списка (исходный список без первого элемента) соответственно:

 arc> (car '(a b c))
 a
 arc> (cdr '(a b c))
 (b c)

Оператор list

Список можно создать с помощью оператора list, который вызывает cons последовательно для всех элементов:

 arc> (list 'a 1 "foo" '(b)) 
 (a 1 "foo" (b))
 arc> (cons 'a (cons 1 (cons "foo" (cons '(b) nil))))
 (a 1 "foo" (b))

Как и в Common Lisp'е, присваивание в Arc работает не только для переменных, но и для внутренностей структур. Т. е. его можно использовать и для изменения списков:

 arc> x
 (a b)
 arc> (= (car x) 'z)
 z
 arc> x
 (z b)

Оператор def

Можно определить новые с помощью оператора def, который принимает идентификатор — будущее имя функции, список идентификаторов — имена параметров, и ноль или более выражений — тело функции. При вызове функции, эти выражения будут вычисляются по-очереди,

Вот пример функции, которая принимает два числа и возвращает среднее арифметическое:

 arc> (def average (x y) 
           (/ (+ x y) 2))
 #<procedure: average>
 arc> (average 2 4)
 3

Операторы let и with

Есть два оператора, которые обычно используются для создания локальных переменных: let и with. Первый — для только одной переменной.

 arc> (let x 1 
      (+ x (* x 2)))
 3
 arc> (with (x 3 y 4)
      (sqrt (+ (expt x 2) (expt y 2))))
 5

Оператор if

Стандартный условный оператор — это if. Как и = и def, он не вычисляет все значения аргументов. Если передано три аргумента, то он вычисляет первый, и если результат истина, вычисляет и возвращает значение второго, иначе, вычисляет и возвращает значение третьего.

 arc> (if (odd 1) 'a 'b)
 a
 arc> (if (odd 2) 'a 'b)
 b

Если третий аргумент if пропущен, считается, что его значение nil.

 arc> (if (odd 2) 'a)
 nil

If с четырьмя и более аргументами эквивалентно нескольким вложенным if.

 (if a b c d e)

эквивалентно

 (if a
     b
     (if c
         d
         e))

Операторы or и and

Операторы or и and работают как условные операторы, потому что они не вычисляют свои аргументы когда это не необходимо.

 arc> (and nil
           (pr "you'll never see this"))
 nil

Оператор is

Стандартный оператор сравнения называется is. Он возвращает истину, если его аргументы идентичны, или, в случае со строками, состоят из одинаковых символов.

 arc> (is 'a 'a)
 t
 arc> (is "foo" "foo")
 t
 arc> (let x (list 'a) 
        (is x x))
 t
 arc> (is (list 'a) (list 'a))
 nil

См. также

Lisp

Ссылки