Получить букву, соответствующую числу в e (IEEE 1646)

Я хочу преобразовать целочисленные значения в строковые символы следующим образом:

0 to "a"

1 to "b"

и так далее до

26 to "z"

Есть ли способ сделать это в e без большого оператора case?

Примечание. e является строго типизированным, и с строковыми значениями невозможно выполнять какие-либо арифметические действия. Также нет char-подобного типа.

Еще один узел: для всех вас, горячих стрелков C/C++, которые продолжают голосовать против моего вопроса, это не такая простая проблема, как вы могли подумать.


person Tudor Timi    schedule 21.11.2014    source источник
comment
Понятия не имею о e, но в целом char(97 + n) где char возвращает char из кода ascii/unicode   -  person Alex K.    schedule 21.11.2014
comment
Я знаю, как это сделать на C/C++, большое спасибо. Зачем отвечать/проголосовать против вопросов, о которых вы понятия не имеете?   -  person Tudor Timi    schedule 21.11.2014
comment
Я не минусовал, мой комментарий был комментарием, а не ответом. Я понятия не имею, знали вы об этом или нет - если бы вы не знали, мой комментарий мог бы быть весьма полезным, в чем, в конце концов, смысл этого сайта.   -  person Alex K.    schedule 21.11.2014
comment
@АлексК. Извините, должно быть, это был парень, который написал ответ на С++.   -  person Tudor Timi    schedule 21.11.2014
comment
@ Tudor, я думаю, вероятно, потому, что изначально в заголовке вопроса не упоминалось e, некоторые люди не понимали, о каком языке идет речь.   -  person Yuri Tsoglin    schedule 28.11.2014


Ответы (2)


Вы можете сделать что-то вроде этого:

{0c"a"+my_num}.as_a(string)

0c"a" обозначает значение ASCII буквы «a». И as_a() преобразование списка чисел (на самом деле, байтов) в строку создает строку, в которой каждый символ имеет значение ASCII соответствующего элемента списка.

person Yuri Tsoglin    schedule 28.11.2014
comment
Это ответ, который я искал: D Упоминается ли это где-то в документации (я, например, не нашел)? - person Tudor Timi; 28.11.2014
comment
Да, оба пункта упоминаются в документации. Первый упоминается в разделе о литералах и константах (буквенный символ). Второй упоминается там, где описываются as_a() и преобразования типов (между различными комбинациями типов). - person Yuri Tsoglin; 28.11.2014

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

Рассмотрим следующий пример:

<'
type chars : [a, b, c, d, e, f, g];

extend sys {
    run() is also {
        var l : list of int[0..6];
        var s: string = "";

        gen l keeping {it.size() == 5};
        print l;
        for each in l { print it.as_a(chars); };

        for each in l { s = append(s, it.as_a(chars)); };
        print s;
    };
};        
'>

Вывод этого примера будет:

  l = 
0.      4
1.      0
2.      6
3.      4
4.      5
  it.as_a(chars) = e
  it.as_a(chars) = a
  it.as_a(chars) = g
  it.as_a(chars) = e
  it.as_a(chars) = f
  s = "eagef"

Обратите внимание, что вы можете назначать пользовательские значения элементам в перечислении. Таким образом, вы можете присвоить элементам перечисления стандартные значения ASCII.

 type chars : [a=10, b=11, c=12, d=13, e=14, f=15, g=16];
person Kalev    schedule 25.11.2014
comment
Это также концептуально похоже на большой оператор case, потому что мы должны сами определить большой enum. Однако это более элегантно, потому что позволяет выполнять преобразования в обоих направлениях. - person Tudor Timi; 25.11.2014