Как взломать GHCi (или Hugs), чтобы он печатает символы Unicode без экранирования?

Посмотрите на проблему: обычно в интерактивной среде Haskell нелатинские символы Unicode (которые составляют часть результатов) печатаются с экранированием, даже если локаль допускает такие символы (в отличие от прямого вывода через ] putStrLn , putChar , который выглядит хорошо и читабельно) - в примерах показаны GHCi и Hugs98:

$ ghci
GHCi, version 7.0.1: http://www.haskell.org/ghc/  :? for help
Prelude> "hello: привет"
"hello: \1087\1088\1080\1074\1077\1090"
Prelude> 'Я'
'\1071'
Prelude> putStrLn "hello: привет"
hello: привет
Prelude> :q
Leaving GHCi.
$ hugs -98
__   __ __  __  ____   ___      _________________________________________
||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__||  __||     Copyright (c) 1994-2005
||---||         ___||           World Wide Web: http://haskell.org/hugs
||   ||                         Bugs: http://hackage.haskell.org/trac/hugs
||   || Version: September 2006 _________________________________________

Hugs mode: Restart with command line option +98 for Haskell 98 mode

Type :? for help
Hugs> "hello: привет"
"hello: \1087\1088\1080\1074\1077\1090"
Hugs> 'Я'
'\1071'
Hugs> putStrLn "hello: привет"
hello: привет

Hugs> :q
[Leaving Hugs]
$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
$ 

Мы можем догадаться, что это потому, что print и показывают используются для форматирования результата, и эти функции делают все возможное, чтобы форматировать данные каноническим, максимально переносимым способом - поэтому они предпочитают избегать странных символов (возможно, это даже прописано в стандарте для Haskell):

$ ghci
GHCi, version 7.0.1: http://www.haskell.org/ghc/  :? for help
Prelude> show 'Я'
"'\\1071'"
Prelude> :q
Leaving GHCi.
$ hugs -98
Type :? for help
Hugs> show 'Я'
"'\\1071'"
Hugs> :q
[Leaving Hugs]
$ 

Но все же было бы неплохо, если бы мы знали, как взломать GHCi или Hugs, чтобы печатать эти символы в удобочитаемом виде, то есть напрямую, без экранирования. Это можно оценить при использовании интерактивной среды Haskell в образовательных целях, для учебника / демонстрации Haskell перед неанглоязычной аудиторией, которой вы хотите показать Haskell на данных на их человеческом языке.

На самом деле, это полезно не только в образовательных целях, но и для отладки! Когда у вас есть функции, которые определены в строках, представляющих слова других языков, с символами, отличными от ASCII. Итак, если программа зависит от языка, и только слова другого языка имеют смысл в качестве данных, и у вас есть функции, которые определены только для таких слов, для отладки в GHCi важно видеть эти данные.

Подводя итог моему вопросу: Какие есть способы взломать существующие интерактивные среды Haskell для более удобной печати Unicode в результатах? («Дружелюбнее» в моем случае означает даже «проще»: я бы хотел, чтобы print в GHCi или Hugs отображали нелатинские символы простым прямым способом, как это сделано с помощью putChar , putStrLn , т.е. без экранирования.)

(Возможно, помимо GHCi и Hugs98, я также посмотрю на существующие режимы Emacs для взаимодействия с Haskell, чтобы увидеть, могут ли они представить результаты в красивом, неэкранированном виде. мода.)

24
задан imz -- Ivan Zakharyaschev 8 March 2015 в 11:59
поделиться