Написание переносимой схемы кода. Что-нибудь «стандартное» помимо самого R5RS?
==============================================================================

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

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

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

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

РЕДАКТИРОВАТЬ | Давайте переопределим «стандарт» как "общий".

Сложный вопрос.

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

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

Старое усилие - SLIB.

[http://people.csail.mit.edu/jaffer/SLIB](https://people.csail.mit.edu/jaffer/SLIB) 

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

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

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

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



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



я полагаю, что**in Scheme, portability is a fool's errand**, поскольку реализации Scheme более отличаются, чем похожи, и нет единой реализации, которую пытаются эмулировать другие реализации (в отличие, например, от Python и Ruby).

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

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

A prime example is `case-lambda` ([SRFI 16](http://srfi.schemers.org/srfi-16/srfi-16.html)); it can be implemented portably, and the reference implementation demonstrates it, but it's definitely less optimal compared to a built-in `case-lambda`, since you're having to implement function dispatch in "user" code.
Another example is `stream-constant` from [SRFI 41](http://srfi.schemers.org/srfi-41/srfi-41.html). The reference implementation uses an O(n) simulation of circular lists for portability, but any decent implementation should adapt that function to use real circular lists so that it's O(1).†

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

† Есть на самом деле[Теперь способ реализации`stream-constant` in an O(1) fashion](http://srfi-email.schemers.org/srfi-41/msg/3066997) без использования круговых списков вообще. Портативный и быстрый для победы!



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

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