Mattwar в Своенравный блог имел большую статью о том, как копировать расширяемый контекст данных Linq2Sql. Проверьте его - , НАСМЕШКИ ОТКЛОНЯЮТ - AN РАСШИРЯЕМЫЙ LINQ К SQL DATACONTEXT
Мне нравится твоя цель, но это большая работа. Пара подсказок:
Я работал над GHC, и вам не нужна какая-либо часть исходников. Hugs - гораздо более простая и понятная реализация, но, к сожалению, она на C.
Это небольшой кусок головоломки, но Марк Джонс написал красивую статью под названием Typing Haskell in Haskell , в которой будет отличной отправной точкой для вашего внешнего интерфейса.
Удачи! Определение языковых уровней для Haskell с подтверждающими данными, полученными в классе, принесет большую пользу сообществу и определенно станет результатом, пригодным для публикации!
Uhc / Ehc - это серия компиляторов, включающих / отключающих различные функции Haskell. http://www.cs.uu.nl/wiki/Ehc/WebHome#What_is_UHC_And_EHC
Baskell - обучающая реализация, http://hackage.haskell.org/package/baskell
Вы можете начать с выбора, скажем, системы типов для реализации. Это примерно так же сложно, как интерпретатор для схемы, http://hackage.haskell.org/package/thih
Вы можете посмотреть Happy (yacc-подобный синтаксический анализатор в Haskell), в котором есть синтаксический анализатор Haskell.
Вам не кажется, что было бы проще взять исходники GHC и вырезать то, что вам не нужно, чем написать свой собственный интерпретатор Haskell с нуля? Вообще говоря, должно быть много меньше усилий, затрачиваемых на удаление функций, по сравнению с созданием / добавлением функций.
GHC в любом случае написан на Haskell, так что технически это остается в вашем вопрос интерпретатора Haskell, написанного на Haskell.
Вероятно, не будет слишком сложно сделать все это статически связанным, а затем распространять только ваш настроенный GHCi, чтобы студенты не могли загружать другие исходные модули Haskell. Что касается того, сколько работы потребуется, чтобы предотвратить загрузку других объектных файлов Haskell, я понятия не имею. Вы также можете отключить FFI,
Этот может быть хорошей идеей - создайте крошечную версию NetLogo на Haskell. Здесь - крошечный интерпретатор.
посмотрим, может ли гелий стать лучшей базой для развития, чем стандартный haskell.
создать язык, который имеет именно те функции Haskell, которые мне нужны, и запрещает все остальное. По мере того, как учащиеся прогрессируют, я могу выборочно «включать» различные функции после того, как они овладеют основами.
Я предлагаю более простое (с меньшим объемом работы) решение этой проблемы. Вместо создания реализации Haskell, в которой вы можете отключить функции, оберните компилятор Haskell программой, которая сначала проверяет, не использует ли код какие-либо запрещенные вами функции, а затем использует готовый компилятор для ее компиляции.
Это было бы похоже на HLint (а также своего рода противоположность):
HLint (ранее Dr. Haskell) читает программы на Haskell и предлагает изменения, которые, надеюсь, облегчат их чтение. HLint также позволяет легко отключать нежелательные предложения, и добавлять свои собственные предложения.
Хотите создать интерпретатор с нуля? Начните с реализации более простого функционального языка, такого как лямбда-исчисление или его вариант. Для последнего есть неплохая вики-книга под названием Напишите себе схему за 48 часов , которая дает классное и прагматичное введение в методы синтаксического анализа и интерпретации.
Ручная интерпретация Haskell будет намного сложнее, так как вам придется иметь дело с очень сложными функциями, такими как классы типов, чрезвычайно мощная система типов (вывод типов!) И ленивое вычисление (методы сокращения).
Таким образом, вы должны определить довольно небольшое подмножество Haskell для работы, а затем, возможно, начать с пошагового расширения примера схемы.
Дополнение:
Обратите внимание, что в Haskell, у вас есть полный доступ к API интерпретаторов (по крайней мере, в GHC), включая парсеры, компиляторы и, конечно же, интерпретаторы.
Используемый пакет - подсказка (Language.Haskell. *) . К сожалению, я не нашел ни онлайн-руководств по этому поводу, ни пробовал самостоятельно, но это выглядит многообещающе.
Серия компиляторов EHC, вероятно, лучший выбор: она активно развивается и кажется именно тем, что вам нужно - серией небольших компиляторов / интерпретаторов лямбда-исчислений, кульминацией которых стал Haskell '98.
Но вы также можете посмотреть на различные языки, разработанные Пирсом Типы и языки программирования , или интерпретатор Helium (урезанный Haskell, предназначенный для студентов http://en.wikipedia.org/wiki/ Гелий_ (Haskell) ).
Существует полный синтаксический анализатор 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, переход будет прозрачным.