Написание переносного кода схемы. Является ли что-либо "стандартным" за пределами R5RS?

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

Становится очевидным, что код схемы публикации не так-то просто сделать, причем все эти разные реализации и никакие реальные стандарты не лежат в основе самого языка (R5RS). Например, мне почти наверняка понадобится сделать базовый ввод-вывод на диске и через TCP-сокет вместе с манипуляциями с строкой, такими как scan/regex, которые, похоже, не покрываются R5RS, если я не вижу их в документе. Кажется, что Scheme - это скорее "концепция", чем практический язык... это справедливая оценка? Возможно, мне стоит взглянуть на что-то вроде Haskell, если я хочу изучить функциональный язык программирования, который больше подходит для использования в проектах с открытым исходным кодом?

В реальности, насколько сильно возникают различные варианты реализации схем, когда вы хотите опубликовать проект с открытым исходным кодом? Мне действительно не нужно поддерживать 5 различных функций для основных вещей, таких как манипуляции с строками в различных основных реализациях (Chicken, guile, MIT, DrRacket). Сколько людей на самом деле пишут схему совместимости с перекрестной реализацией, а не тесно связаны с библиотечными функциями, которые существуют только в их собственной схеме?

Я прочитал http://www.ccs.neu.edu/home/dorai/scmxlate/scheme-boston/talk.html, который не наполняет меня уверенностью;)

ИЗМЕНИТЬ | Позвольте переопределить "стандарт" как "общий".

Ответ 1

Трудный вопрос.

Большинство людей решают быть прагматичными. Если важна переносимость между реализациями, они записывают основную часть программы в стандартную схему и изолируют нестандартные части в (небольших) библиотеках. Были разные подходы к тому, как именно это сделать. Одним из недавних усилий является SnowFort.

http://snow.iro.umontreal.ca/

Более старым усилием является SLIB.

http://people.csail.mit.edu/jaffer/SLIB

Если вы посмотрите - или попросите - библиотеки для регулярных выражений и lexer/parsers, вы быстро найдете их.

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

Однако для программирования "реального мира" R5RS может оказаться не лучшим выбором. Поэтому R6RS (и R7RS?) Включают более "реальные" библиотеки.

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

Ответ 2

Я считаю, что в Схеме, переносимость - это безумное поручение, поскольку реализации Схемы больше, чем они похожи, и нет единой реализации, которую другие реализации пытаются эмулировать (в отличие от Python и Ruby, например).

Таким образом, переносимость в Scheme аналогична использованию программного обеспечения для написания игр "потому что это в общем подмножестве между OpenGL и DirectX". Другими словами, это самый низкий общий знаменатель - это можно сделать, но вы теряете доступ ко многим функциям, которые предлагает реализация.

По этой причине, хотя SRFI обычно имеют переносимую ссылочную реализацию (где это практически возможно), некоторые из них сопровождаются примечаниями о том, что реализация Scheme качества должна адаптировать библиотеку к использованию специфичных для реализации функций для оптимальной работы.

  • Ярким примером является case-lambda (SRFI 16); он может быть реализован портативно, и эталонная реализация демонстрирует его, но он определенно менее оптимален по сравнению со встроенным case-lambda, поскольку вам необходимо реализовать функцию отправки в "пользовательском" коде.
  • Другим примером является stream-constant из SRFI 41. Эталонная реализация использует O (n) моделирование круговых списков для переносимости, но любая достойная реализация должна адаптировать эту функцию к использованию реальных круговых списков, чтобы она O (1).

Список можно продолжить. Многие полезные вещи в Схеме не являются переносимыми. SRFI помогают сделать больше возможностей переносимыми, но никоим образом не могут покрывать все SRFI. Если вы хотите, чтобы полезная работа была выполнена эффективно, шансы очень хорошие, вам придется использовать непереносимые функции. Я думаю, лучшее, что вы можете сделать, это написать фасад, чтобы инкапсулировать те функции, которые еще не охвачены SRFI.

Фактически теперь способ реализовать stream-constant в способе O (1) без используя круговые списки вообще. Портативный и быстрый для победы!

Ответ 3

Я пишу блог , который использует Scheme в качестве языка его реализации. Поскольку я не хочу отчуждать пользователей какой-либо конкретной реализации Схемы, я пишу на ограниченном диалекте Схемы, который основан на макросах R5RS плюс синтаксис, плюс моя Стандартная прелюдия. Я не считаю это слишком строгим для тех алгоритмических программ, которые я пишу, но ваши потребности могут быть разными. Если вы посмотрите на различные упражнения в блоге, вы увидите, что я написал свой собственный регулярный выражетель, что я выполнил большое количество манипуляций с строками и что я вырвал файлы из Интернета, wget (я использую Chez Scheme - пользователи должны предоставить свой собственный переносимый механизм оболочки, если они используют что-либо еще); Я даже сделал ограниченную графическую работу, написав терминальные последовательности ANSI.

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

Ответ 4

Стоит отметить, что современные реализации Схемы сами по себе довольно переносимы; вы часто можете переносить целые программы в новые среды, просто используя соответствующую схему. Тем не менее, это не помогает программистам библиотеки, и что там, где R7RS-small, последнее определение схемы, входит. Оно пока еще не широко реализовано, но оно обеспечивает большее общее ядро, чем R5RS.