Забудьте о кодировке символов
Компилятору Clean не важно, в какой кодировке вы сохранили исходный файл, просто в значениях байтов в файле. Это имеет некоторые аккуратные последствия.
В теле исходного кода разрешены только байты с кодовыми точками, соответствующими печатным символам ASCII, в дополнение к тем, для которых \t\r\n
.
литералы:
В String
и [Char]
Литералы ( "stuff"
и ['stuff']
соответственно) разрешены любые байты, кроме 0 , с оговоркой, что "
и '
должны быть экранированы (для String
и [Char]
соответственно), и что новые строки и возвраты Carraige должны быть заменены на \n
и \r
(также соответственно).
В Char
литералах допускается любой байт, кроме 0 , что означает, что:
'\n'
'
'
То же самое, но второй на один байт короче.
Экранирование:
Кроме стандартных экранированных букв \t\r\n
(и т. Д.), Все нечисловые экранирующие последовательности в Clean предназначены либо для косой черты, либо для кавычки, используемой для разграничения литерала, внутри которого находится экранированная буква .
Для числовых escape-последовательностей число обрабатывается как восьмеричное значение, оканчивающееся после трех цифр. Это означает, что если вы хотите, чтобы за нулем следовал символ 1
в String
, вам нужно использовать "\0001"
(или "\0\61"
), а не "\01"
. Однако, если вы следите за выходом с чем-либо, кроме чисел, вы можете опустить ведущие нули.
Последствия:
Эта причуда с тем, как Clean обрабатывает свои исходные файлы, позволяет String
и ['Char']
эффективно превращается в последовательности из однозначных чисел с 256 базовыми числами, которые имеют множество применений для игры в код, например, для хранения индексов (конечно, до 255).
import StdEnv
+a and b
(21 байт) не меньше%[a:r]|a= %r=a;%_=True
(22 байт)? Или это будетimport StdEnv
+a=True and b=True
(31 байт), и в этом случае он действительно определенно будет короче? (