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