Запишите интерпретатор Haskell в Haskell

Mattwar в Своенравный блог имел большую статью о том, как копировать расширяемый контекст данных Linq2Sql. Проверьте его - , НАСМЕШКИ ОТКЛОНЯЮТ - AN РАСШИРЯЕМЫЙ LINQ К SQL DATACONTEXT

85
задан Rakete1111 30 July 2017 в 08:56
поделиться

11 ответов

Мне нравится твоя цель, но это большая работа. Пара подсказок:

  • Я работал над GHC, и вам не нужна какая-либо часть исходников. Hugs - гораздо более простая и понятная реализация, но, к сожалению, она на C.

  • Это небольшой кусок головоломки, но Марк Джонс написал красивую статью под названием Typing Haskell in Haskell , в которой будет отличной отправной точкой для вашего внешнего интерфейса.

Удачи! Определение языковых уровней для Haskell с подтверждающими данными, полученными в классе, принесет большую пользу сообществу и определенно станет результатом, пригодным для публикации!

74
ответ дан 24 November 2019 в 08:14
поделиться

Uhc / Ehc - это серия компиляторов, включающих / отключающих различные функции Haskell. http://www.cs.uu.nl/wiki/Ehc/WebHome#What_is_UHC_And_EHC

2
ответ дан 24 November 2019 в 08:14
поделиться

Baskell - обучающая реализация, http://hackage.haskell.org/package/baskell

Вы можете начать с выбора, скажем, системы типов для реализации. Это примерно так же сложно, как интерпретатор для схемы, http://hackage.haskell.org/package/thih

16
ответ дан 24 November 2019 в 08:14
поделиться

Вы можете посмотреть Happy (yacc-подобный синтаксический анализатор в Haskell), в котором есть синтаксический анализатор Haskell.

3
ответ дан 24 November 2019 в 08:14
поделиться

Вам не кажется, что было бы проще взять исходники GHC и вырезать то, что вам не нужно, чем написать свой собственный интерпретатор Haskell с нуля? Вообще говоря, должно быть много меньше усилий, затрачиваемых на удаление функций, по сравнению с созданием / добавлением функций.

GHC в любом случае написан на Haskell, так что технически это остается в вашем вопрос интерпретатора Haskell, написанного на Haskell.

Вероятно, не будет слишком сложно сделать все это статически связанным, а затем распространять только ваш настроенный GHCi, чтобы студенты не могли загружать другие исходные модули Haskell. Что касается того, сколько работы потребуется, чтобы предотвратить загрузку других объектных файлов Haskell, я понятия не имею. Вы также можете отключить FFI,

1
ответ дан 24 November 2019 в 08:14
поделиться

Этот может быть хорошей идеей - создайте крошечную версию NetLogo на Haskell. Здесь - крошечный интерпретатор.

3
ответ дан 24 November 2019 в 08:14
поделиться

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

2
ответ дан 24 November 2019 в 08:14
поделиться

создать язык, который имеет именно те функции Haskell, которые мне нужны, и запрещает все остальное. По мере того, как учащиеся прогрессируют, я могу выборочно «включать» различные функции после того, как они овладеют основами.

Я предлагаю более простое (с меньшим объемом работы) решение этой проблемы. Вместо создания реализации Haskell, в которой вы можете отключить функции, оберните компилятор Haskell программой, которая сначала проверяет, не использует ли код какие-либо запрещенные вами функции, а затем использует готовый компилятор для ее компиляции.

Это было бы похоже на HLint (а также своего рода противоположность):

HLint (ранее Dr. Haskell) читает программы на Haskell и предлагает изменения, которые, надеюсь, облегчат их чтение. HLint также позволяет легко отключать нежелательные предложения, и добавлять свои собственные предложения.

  • Реализуйте свои собственные «предложения» HLint, чтобы не использовать функции, которые вы не разрешаете.
  • Отключите все стандартные предложения HLint.
  • Заставьте вашу оболочку запускать измененный HLint как first step
  • Обрабатывать предложения HLint как ошибки. То есть, если HLint «пожаловался», то программа не переходит на этап компиляции
20
ответ дан 24 November 2019 в 08:14
поделиться

Хотите создать интерпретатор с нуля? Начните с реализации более простого функционального языка, такого как лямбда-исчисление или его вариант. Для последнего есть неплохая вики-книга под названием Напишите себе схему за 48 часов , которая дает классное и прагматичное введение в методы синтаксического анализа и интерпретации.

Ручная интерпретация Haskell будет намного сложнее, так как вам придется иметь дело с очень сложными функциями, такими как классы типов, чрезвычайно мощная система типов (вывод типов!) И ленивое вычисление (методы сокращения).

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

Дополнение:

Обратите внимание, что в Haskell, у вас есть полный доступ к API интерпретаторов (по крайней мере, в GHC), включая парсеры, компиляторы и, конечно же, интерпретаторы.

Используемый пакет - подсказка (Language.Haskell. *) . К сожалению, я не нашел ни онлайн-руководств по этому поводу, ни пробовал самостоятельно, но это выглядит многообещающе.

24
ответ дан 24 November 2019 в 08:14
поделиться

Серия компиляторов EHC, вероятно, лучший выбор: она активно развивается и кажется именно тем, что вам нужно - серией небольших компиляторов / интерпретаторов лямбда-исчислений, кульминацией которых стал Haskell '98.

Но вы также можете посмотреть на различные языки, разработанные Пирсом Типы и языки программирования , или интерпретатор Helium (урезанный Haskell, предназначенный для студентов http://en.wikipedia.org/wiki/ Гелий_ (Haskell) ).

6
ответ дан 24 November 2019 в 08:14
поделиться

Существует полный синтаксический анализатор Haskell: http://hackage.haskell.org/package/haskell-src-exts

После его анализа удалить или запретить определенные вещи легко. Я сделал это для tryhaskell.org, чтобы запретить операторы импорта, поддерживать определения верхнего уровня и т. Д.

Просто проанализируйте модуль:

parseModule :: String -> ParseResult Module

Тогда у вас есть AST для модуля:

Module SrcLoc ModuleName [ModulePragma] (Maybe WarningText) (Maybe [ExportSpec]) [ImportDecl] [Decl]    

Тип Decl обширен: http://hackage.haskell.org/packages/archive/haskell-src-exts/1.9.0/doc/html/Language-Haskell-Exts-Syntax.html#t%3ADecl

Все, что вам нужно для этого нужно определить белый список, в котором доступны декларации, импорт, символы, синтаксис, затем пройти AST и выдать «ошибку синтаксического анализа» для всего, о чем вы не хотите, чтобы они знали. Вы можете использовать значение SrcLoc, прикрепленное к каждому узлу в AST:

data SrcLoc = SrcLoc
     { srcFilename :: String
     , srcLine :: Int
     , srcColumn :: Int
     }

Нет необходимости повторно реализовывать Haskell. Если вы хотите предоставить более удобные ошибки компиляции, просто проанализируйте код, отфильтруйте его, отправьте компилятору и проанализируйте вывод компилятора. Если это «не удалось сопоставить ожидаемый тип a с предполагаемым a -> b », то вы знаете, что, вероятно, у функции слишком мало аргументов.

Если вы действительно не хотите тратить время на реализацию Haskell с нуля или возиться с внутренними компонентами Hugs или какой-нибудь глупой реализацией, я думаю, вам следует просто отфильтровать то, что передается в GHC. Таким образом, если ваши ученики захотят взять свою кодовую базу, перейти к следующему шагу и написать настоящий полноценный код Haskell, переход будет прозрачным.

37
ответ дан 24 November 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: