Роль специальных функций в Racket для создания новых языков - PullRequest
1 голос
/ 11 июня 2019

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

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

# Items for calculation: 
slist=["4", "8", "+", "5", "*", "10", "/", "4", "-", "6", "5", "/", "*"]

# Main code: 
mainstack = []
for item in slist: 
    print("mainstack: ", mainstack)
    print("item: ", item)
    if item in ['+','-','*','/']: 
        n2 = mainstack.pop()
        n1 = mainstack.pop()
        if item == '+':     mainstack.append(n1 + n2)
        elif item == '-':   mainstack.append(n1 - n2)
        elif item == '*':   mainstack.append(n1 * n2)
        elif item == '/':   mainstack.append(n1 / n2)
    else: 
        try:
            mainstack.append(float(item))
        except: 
            print("Invalid entry: ", item)
            quit()
print("Final answer: ", mainstack)

Вывод:

mainstack:  []
item:  4
mainstack:  [4.0]
item:  8
mainstack:  [4.0, 8.0]
item:  +
mainstack:  [12.0]
item:  5
mainstack:  [12.0, 5.0]
item:  *
mainstack:  [60.0]
item:  10
mainstack:  [60.0, 10.0]
item:  /
mainstack:  [6.0]
item:  4
mainstack:  [6.0, 4.0]
item:  -
mainstack:  [2.0]
item:  6
mainstack:  [2.0, 6.0]
item:  5
mainstack:  [2.0, 6.0, 5.0]
item:  /
mainstack:  [2.0, 1.2]
item:  *
Final answer:  [2.4]

Каковы конкретные роли специальных функций в Racket для создания новых языков?Почему бы просто не использовать обычное программирование для преобразования указанного доменного ввода в требуемые выходные данные?

1 Ответ

2 голосов
/ 11 июня 2019

Есть разница. Пока вы написали переводчик для языка на Python. Создание синтаксического анализатора для языка поверхностей и перевод его в s-выражения, включающие базовую библиотеку Racket, в основном означают, что полученный код работает на нативном языке. Вы можете скомпилировать «код стека» и получить двоичный файл.

В Python вы можете написать компилятор калькулятора, который компилирует код в python и позволяет динамическую компиляцию, так что python создает байт-код, который выполняет код на нативном языке, но у него нет функций, позволяющих писать на других языках в python ,

Racket - это не один язык, а скорее похожий на язык, похожий на Scheme, с системами для написания нового языка, который в действительности становится модулем для Racket. Затем вы можете написать что-нибудь на одном языке и, возможно, импортировать это как библиотеку на другом. Похоже на Parrot, где идея заключалась в том, что Python и Perl будут иметь одинаковое время выполнения и что они могут совместно использовать библиотеки.

В качестве примера вы можете загрузить Algol60 в Racket, самый успешный язык программирования, разработанный комитетом и предшественник большинства современных языков программирования. Python и C являются диалектами Алгола!

Могу поспорить, что вы могли бы написать синтаксический анализатор Python и базовую библиотеку Python таким образом, чтобы вы могли передавать его другим библиотекам, созданным на python, и получить полный запуск Python под Racket. После этого вы можете просто импортировать другой код ракетки, как если бы он был написан на Python, и использовать его напрямую, или вы можете импортировать библиотеки Python и использовать его на любом из других языков, поддерживаемых Racket.

Единственное, что сделало бы это еще слаще, было бы, если бы они могли создать ядро ​​Racket под компилятором нанопроходов Chez Scheme. Тогда вы сможете скомпилировать все, что поддерживает Racket, практически во что угодно.

...