Arc построен на основе Racket. Поскольку оба они относятся к семейству Lisp, мне интересно узнать о преимуществах Arc над Racket или какова мотивация создания Arc, учитывая, что Racket доступен?
Преимущество Arc над Racket
Ответы (2)
Написание собственного языка, в некотором смысле, расширяет возможности: вы можете выбирать, какие примитивы, какие виды выражений удобно писать на этом языке. В этом смысле вы можете взглянуть на такую книгу, как On Lisp, и увидеть, что основные авторы Arc иметь твердое мнение о том, какие вещи они хотели бы от языка.
Если я возьму ваш вопрос и сведу его к сути, он будет звучать так: почему люди должны писать предметно-ориентированные языки?
(Это отдельный вопрос, стоит ли разработчикам Arc заново реализовывать столько примитивных средств, таких как их собственные системы макросов и модулей, когда такие механизмы уже встроены в Racket. Но авторы Arc имеют полное право переделывать -изобретать.)
Я предполагаю, что одно из возражений, которые у меня есть к Arc, заключается в следующем: то, как они реализовали официальную среду выполнения, затрудняет повторное использование работы, которую они проделали, для простого Racket. В этом смысле это усилия, которые помогают только одному сообществу, тогда как было бы неплохо иметь возможность легко извлекать выгоду из работы людей из Arc.
Racket - это диалект Scheme, а Arc - нет. Однако они оба являются диалектами LISP. Arc уменьшает количество круглых скобок и имеет причудливый встроенный синтаксис, позволяющий сократить размер кода. Примеры:
;; scheme
(if p1 c1
(if p2 c2
(if p3 c3 a3)))
;; arc simplifies if
(if p1 c1
p2 c2
p3 c3
a3)
;; scheme
(f1(f2(f3 a b)))
;; arc simplifies cascading calls
(f1:f2:f3 a b)
;; scheme
(lambda (x) (+ x x))
;; arc simplified one argument anonymous functions
[+ _ _ ]
;; scheme array access
(vector-ref v1 5)
;; arc simplifies array access
(v1 5)
Вы можете выбрать один над другим. Лично мне нравится синтаксис Arc, но не факт, что он реализован как интерпретатор. Я бы хотел, чтобы они реализовали Arc как язык модуля Racket, так как тогда вы действительно могли бы разрабатывать в drracket, отлаживать и создавать исполняемые файлы. Это может даже позволить создавать библиотеки Racket в Arc или наоборот.
Если вы хотите сделать совместимый код, вы должны быть более строгими и использовать R6RS/R5RS, чем использовать язык рэкета по умолчанию или дугу, поскольку тогда у вас может быть код, который вы можете запускать не только на рэкете. В ракетке вы можете выбрать R5RS или использовать #!R6RS в качестве первой строки в коде, чтобы принудительно применить стандарт. В обоих случаях результат сможет работать под другими реализациями/компиляторами.
(cond (p1 c1) (p2 c2) (p3 c3) (#t c4))
немного более справедливое сравнение.
- person Theo Belaire; 19.03.2013