2017-02-11 8 views
3

При вводе 'a' в Gforth, то ASCII номер символа (тот же номер, который будет поместить в стек, используя key слово и нажав в) помещается в стек.Получение кода ASCII с Gforth

Это не работает, например, с ' ' (пробел). Вместо этого:

' ' ok 
.s <1> 34384939008 ok 

Число «должно быть» 32. Что объясняет это поведение? И что можно сделать по этому поводу - кроме того, чтобы вручную поставить номер ASCII, соответствующий ' ' (пробел) в стеке?

ответ

7

Этот синтаксис 'a' является совершенно новым для Forth. Он добавляется как расширение поверх традиционного синтаксиса, который анализирует все на токены с пробелами. Таким образом, 'a' - это один атомный токен, который затем анализируется как символьный литерал.

' ' не является атомарным токеном, так как он содержит пробельный символ. Скорее, он анализируется как два токена '. Это на самом деле абсолютно правильный код Forth, потому что ' - это четвертое слово (называемое тиком). В вашем примере первый тик работает на втором. Результат, 34384939008, является xt для '.

Что делать вместо этого? Традиционными словами для получения ASCII-кода символа являются CHAR или [CHAR]. Первый работает в интерпретируемом режиме, а второй - в скомпилированном режиме. BUT они не работают для конкретного случая символа пробела, потому что снова все пробелы разбираются.

Однако есть еще одно слово, которое толкает символ пробела ASCII: BL.

+0

lol, tick даже не эзотерическое слово ... неловко ;-) Я только начал с FORTH и пропустил это. –

+0

только один вопрос: что может быть причиной наличия двух разных версий 'char' и' [char] 'в режиме исполнения и компиляции? –

+2

В интерпретируемом коде имеет смысл только «CHAR». Но оба 'CHAR' и' [CHAR] 'могут быть полезны в скомпилированном коде. '[CHAR]' работает во время компиляции, поэтому он анализирует следующее слово в программе. 'CHAR' работает во время выполнения, поэтому он не работает с текстом программы, а затем вводит поток позже. Это может быть удобно, например, немедленные слова. –

 Смежные вопросы

  • Нет связанных вопросов^_^