Как заставить программу сохранять значения ASCII в erlang?

У меня есть функция, в которую я вхожу из оболочки erlang:

huffman:table([$H,$E,$L,$L,$O]).

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


person Scatman_John    schedule 28.01.2015    source источник
comment
Ключевым моментом здесь является то, что список целых чисел, возвращаемый вашей функцией huffman:table/1, содержит не только печатные символы. Как вы хотите их отображать?   -  person Sylvain Leroux    schedule 28.01.2015
comment
Вот как я хотел бы получить его обратно: [{1,5,{2,3,{$L,2},{$O,1}},3},{3,2,{$E,1 },{$H,1}}] (у меня в списке есть и другие целые числа). Немного грязно прямо сейчас, но, как вы видите, я бы хотел, чтобы значения ASCII оставались такими же после того, как они прошли через мою функцию.   -  person Scatman_John    schedule 28.01.2015


Ответы (3)


Поскольку $H — это просто еще один способ записать целое число 72, его невозможно напечатать как $H, встроенное в Erlang. Вам придется написать свою собственную функцию для вывода значений таким образом.

В показанном вами примере похоже, что вам нужно сохранять небольшие целые числа как целые числа, а буквенные значения печатать как буквы. Что-то вроде этого может сработать:

maybe_char_to_string(N) when $A =< N, N =< $Z ->
    [$$, N];
maybe_char_to_string(N) ->
    integer_to_list(N).

Вот что он выводит:

3> foo:maybe_char_to_string($H).
"$H"
4> foo:maybe_char_to_string(1).
"1"
person legoscia    schedule 28.01.2015
comment
Ах, я вижу, тогда это отвечает на мой вопрос, если я хочу, чтобы вывод ASCII был отдельной функцией. Спасибо! - person Scatman_John; 28.01.2015

Эрланг не различает символы и целые числа. В частности, строковые литералы Erlang, такие как "HELLO", приводят к списку [$H, $E, $L, $L, $O]. Оболочка решает с помощью эвристики (в основном проверяя, что все целые числа являются печатаемыми символами Юникода), выводит ли она [72, 69, 76, 76, 79] или "HELLO". Вот вывод в моем сеансе оболочки:

Erlang R16B03 (erts-5.10.4) [64-bit] [smp:4:4] [async-threads:10]

Eshell V5.10.4  (abort with ^G)
1> [$H,$E,$L,$L,$O].
"HELLO"
2> 
person filmor    schedule 28.01.2015

Если вы хотите напечатать что-то в виде строки, используйте:

io:format("~s", [String]).
person tkowal    schedule 28.01.2015