Saturday, December 22, 2007

Запруды

Ну вот как можно заниматься наукой в такой антисемитской обстановке? Вводная: нужно написать программу, которая бы делала из одних строк на произвольном языке другие по определенным правилам. Произвольный язык подразумевает под собой юникод, в частном случае хотя бы кириллицу.

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

Пришлось пользоваться враждебным Эклипсом, под которым есть камль-плугин, который умеет в собственной эклипсовской консоли (с, о счастье, настраиваемой кодировкой!) писать output программы. Круто. После пары часов траха с эклипсом и настройки подхвата им стандартных и не очень (OUnit) библиотек, наконец, удалось скомпилить и запустить прогу из трех исходных файлов, и тут настал окончательный сокрушительный удар судьбы. Камль не поддерживает юникод. То есть, абсолютно. Символьный тип в нем занимает один байт. А моей проге по большому счету все равно, из чего состоят обрабатываемые ею последовательности, главное, чтобы это что-то членилось на составные части предсказуемым образом. А если в строке записаны символы из UTF-8 или еще чего похуже, то члениться она в абстрактной камлевой программе будет уже способом, несовместимым с общепризнанным.

Видимо, на камле надо ставить крест в данной конкретной задаче. Да, под него есть юникодовая библиотека, я ее даже поставил себе, даже попытался на нее все переделать, но теперь программа уже знает, что ей даются строки в  UTF-8. И это не очень гармонирует с замыслом. Да и просто все это элементарно неудобно. Варианты камля, компилящиеся в .NET некузявы по причине того, что у меня мак. Вот.

Можно все писать на Scheme. Забавный язычок такой, интересно было бы с ним поэкспериментировать. Правда, IDE для него, хоть и сильно удобнее камлевого топлевела, все же смущает MDIшностью своего интерфейса. Еще я так до сих пор не до конца привык к динамической типизации. И, что самое главное, под имеющуюся у меня Схему нет большого количества библиотек общего назначения. В жизни вообще нужно не очень много утилит, но вот SortedSet и SortedMap были бы неплохи. Да и просто Set тоже... В чистом виде я их под Схему не нашел.

Библиотеки в избытке есть в JDK, но на Жаве я писать в принципе не хочу. Так что самый пока приемлемый вариант - это Scala. Надо будет поразбираться с эклипсовским ее плагином, пока идейский не дорос... Пока что не очень понял, как там тесты легко и просто писать, найденный мной пример легким и простым не назовешь никак. Ну и вообще, многословный язык, по сравнению с камлем, хаскелем или лиспом, хоть и сильно лучше жавы. Плохо все.

8 comments:

Anton Nazarov said...

Про кодировку в консоли. В Mac-е вроде обычная юниксовая консоль? Нельзя ли просто перенаправить стандартный вывод в файл?
Если кодировка текста и кодировка консоли не совпадает, можно перекодировать стандартный вывод на лету с помощью пайпов (|) и консольных утилит типа iconv.
Если нужен только русский и английский, то перекодирование из юникода (utf8 и utf16) в cp1251 делается вычитанием какого-то числа, так как порядок букв тот же самый. Если нужны подробности, у меня где-то есть самописный кусок кода на Java, который это делает.
Для Scheme в какчестве IDE можно использовать Emacs, хотя это на любителя. Есть PLT Scheme с неплохой переносимой IDE, которая даже умеет программу в виде деревьев рисовать. Там же есть дополнительные нестандартные библиотеки для самых разных задач.
Надеюсь, что эта информация была полезной :)

Anton Nazarov said...

Кстати, вот это не полезно, случайно?
http://www.linux.org.ru/view-message.jsp?msgid=2363678

Peter said...

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

Посему перенаправлять в файл смысла особого не имеет, ибо потом его где-то еще открывать надо, смотреть, все долго и страшно.

Какая кодировка в консоли вообще хрен знает. В настройках стоит UTF-8. Только в одной из терминалок кириллица отображается вопросиками, а в другой - кодами символов. На лету перекодировать можно, только неясно, куда же.

DrScheme я использую и прусь от нее, вполне себе нормальная штука. Правда, некоторые вещи в ней все же не совсем хороши, например, хочется редактировать разные файлы в разных табах, а не окнах. А так никаких возражений. Тем более, что с юникодом у нее все замечательно, да и библиотеку нужную я нашел-таки. А программу в виде деревьев я еще не видел.

Про АОТ - спасибо, да. Я думал, они не выкладывают новых релизов. Хотя все равно это идеологически враждебная неадаптивная технология.

Anton Nazarov said...

Про деревья я точно не помню. Что-то такое вроде видел :) Я DrScheme ставил только посмотреть, давно, когда даже язык почти не знал.
Кстати, в R6RS вроде работу с юникодом включили в стандарт языка и PLT Scheme впереди всех в плане реализации нового стандарта.
А с кодировками в консоли всегда какие-то косяки :) То у Java в виндовой консоли, то с utf8 в линуксовой текстовой. Но вроде всегда решаются :)

Peter said...

Мне уж предлагают поставить Линукс в эмулятор, и оттуда программировать на камле, типа, у того конкретного Дебиана с русскими буквами все в порядке.

Кстати, а ты какими судьбами Схему знаешь? Вроде, непопулярный такой язык, Лисп и все дела...

Anton Nazarov said...

Знать-то я не особо знаю. Прочитал одну книжку по CommonLisp и пол книжки по Scheme :)
Когда-то курсе на 2-3 мне показали порт Maxim-ы на Pocket PC (Тогде вроде даже Win CE еще :)). А у меня Palm, и я стал искать Maxim-у для пальма. Не нашел, но зато попалась схема для пальма. Потом мне кто-то порекомендовал почитать SICP, мне понравилось, что можно упражнения сразу в наладоннике решать :) Правда целиком SICP я не осилил, сейчас читаю The Scheme Programming Language.

А в линуксе действительно сейчас никаких проблем с русским не заметно. Во всяком случае мне не встречаются в убунтах :)

Peter said...

На SICP я пока еще не забил, хотя уже отвлекся. А ведь схема и для покетов бывает! Это ж афигеть. То есть, можно наукой и в метро позаниматься будет.

Anton Nazarov said...

Для покетов даже CommonLisp и Maxima бывает, правда порт старый, не понятно, заработает ли на современных версиях OS.