Pull to refresh

Comments 10

К сожалению, все это завязано на SP-Forth
В Gforth для подобного можно использовать обработку исключений CATCH… THROW. Собственно, NOTFOUND является некоторой надстройкой над базовым механизмом исключений.
Я конечно давно не брал в руки шашку, лет 15ть уже.

Но простите — а нечто вроде такого — не комильфо?

: variables 
    parse-name dup s" END" strcmp not if nextname create 0 , then ; immediate


и пишем стандартно

variables a b c d e f END

Да, не комильфо :) Вообще не будет работать. Во-первых, strcmp — функция сишная, во-вторых nextname как такового в Форте нет. В-третьих, будет скомпилирована лишь первая переменная.
Ай, цикл забыл. Посыпаю лысину пеплом.

SP-Forth я вообще в глаза не видел, в первой половине 1990х там другие игрушки были. С тех пор кстати у меня идиосинкразия на «кричащие» фортовсеие идентификаторы. В своих собственноручно налепленных интертрепаторах из принципа все писал в lowercase ;-)

Но nextname ранее реализовывался на раз — подсовыванием токена в pad, то бишь входной поток. Или подсовыванием своего эрзаца входного потока. Вот мне стало интересно — а что, такая техника уже не работает?

: variables( 
    begin 
        parse-name dup s" )" =s not dup 
    while
        if nextname create 0 ,  then 
    repeat
    drop 
; immediate

variables( a b c d e f )


Кстати, в gforth nextname есть. Не поленился глянуть — и на самом деле входной поток подменяет.
Форт прекрасен тем, что позволяет обходиться без циклов. Ваше решение, безусловно, имеет право на жизнь. Но оно совершенно в лоб, в духе традиционных языков. Кроме того, я предлагаю не просто реализацию определения кучки переменных, а некий универсальный механизм, базовый принцип, с помощью которого можно решать разнообразные задачи. Заметил, что очень мало людей должно оценивают красоту и мощь определяющих слов, в которых скрыта суть Форта.
Сможете использовать аналогичный подход для, например, констант? А чтобы можно было константе присвоить вычисляемое значение?
Судя по всем автор даже не запускал вариант:
VOCABULARY values
ALSO values DEFINITIONS

: ;VALUES   PREVIOUS DROP ;
: NOTFOUND   VALUED 0 ;

PREVIOUS DEFINITIONS 
  
: VALUES:  ALSO values 0 ;

И если потом попробовать сделать вот так:
VALUES:
  11 aa   
  22 bb 
  33 cc
;VALUES

То все будет вроде бы ок. Но вот только в переменных будут нули. А еще будут переменные 11 22 и 33. А все потому, что в СПФ обработка чисел тоже идет через NOTFOUND. Т.е. NOTFOUND будет вызван 6 раз, а не три — т.е. и для каждого числа тоже.
И вообще, обычно обработка неизвестных лексем через NOTFOUND делается несколько по-другому: лексеме делается проверка типа «а это точно наша лексема?» и если это не так, то она передается дальше по цепочке предыдущему NOTFOUND.
Есть такое пожелание. Вот только зачем это делать? Только потому, что разработчики системы так сказали? Какой предыдущий нотфаунд надо вызывать, если никакого другого нотфаунда в данном контексте не предусмотрено? Поведение «нашей лексемы» в предлагаемом мной варианте использования нотфаунда заключается в создании этой лексемы. То-есть, она всегда «наша». Все очень красиво получается, все оттестировано и работает.
Вы невнимательно читали. Вариант
VALUES:
11 aa
22 bb
33 cc
;VALUES
Я не реализовывал вообще. Ввиду его бесперспективности. А так, да, конечно, если с нулевым вариантом использовать отброшенный вариант записи, эффект будет такой.
Sign up to leave a comment.

Articles