Преимущество дуги над ракеткой - PullRequest
15 голосов
/ 19 декабря 2011

Дуга построена поверх Ракетки .Поскольку оба они принадлежат к семейству Lisp, мне любопытно, какое преимущество Arc над Racket или какова мотивация создания Arc, если Racket доступен?

Ответы [ 2 ]

24 голосов
/ 19 декабря 2011

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

Если я возьму ваш вопрос и сведу его к основам, это звучит так: почему люди должны писать языки, специфичные для предметной области?

(Это отдельный вопрос, чтобы рассмотреть вопрос о том, должны ли ребята из Arc повторно реализовать столько примитивных средств, таких как их собственные макро- и модульные системы, когда уже есть такие механизмы, встроенные в Racket. Но авторы Arc полностью находятся в пределах их права на переизобретение.)

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

17 голосов
/ 20 июля 2012

Ракетка - это диалект Схемы, а Арк - нет. Они оба диалекты 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 в качестве первой строки кода, чтобы применить стандарт. В обоих случаях результат сможет работать в других реализациях / компиляторах.

...