Comments 10
К сожалению, все это завязано на SP-Forth
0
В Gforth для подобного можно использовать обработку исключений CATCH… THROW. Собственно, NOTFOUND является некоторой надстройкой над базовым механизмом исключений.
0
Я конечно давно не брал в руки шашку, лет 15ть уже.
Но простите — а нечто вроде такого — не комильфо?
и пишем стандартно
Но простите — а нечто вроде такого — не комильфо?
: variables
parse-name dup s" END" strcmp not if nextname create 0 , then ; immediate
и пишем стандартно
variables a b c d e f END
+1
Да, не комильфо :) Вообще не будет работать. Во-первых, strcmp — функция сишная, во-вторых nextname как такового в Форте нет. В-третьих, будет скомпилирована лишь первая переменная.
0
Ай, цикл забыл. Посыпаю лысину пеплом.
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 есть. Не поленился глянуть — и на самом деле входной поток подменяет.
0
Форт прекрасен тем, что позволяет обходиться без циклов. Ваше решение, безусловно, имеет право на жизнь. Но оно совершенно в лоб, в духе традиционных языков. Кроме того, я предлагаю не просто реализацию определения кучки переменных, а некий универсальный механизм, базовый принцип, с помощью которого можно решать разнообразные задачи. Заметил, что очень мало людей должно оценивают красоту и мощь определяющих слов, в которых скрыта суть Форта.
Сможете использовать аналогичный подход для, например, констант? А чтобы можно было константе присвоить вычисляемое значение?
Сможете использовать аналогичный подход для, например, констант? А чтобы можно было константе присвоить вычисляемое значение?
0
Судя по всем автор даже не запускал вариант:
И если потом попробовать сделать вот так:
То все будет вроде бы ок. Но вот только в переменных будут нули. А еще будут переменные 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 раз, а не три — т.е. и для каждого числа тоже.
0
И вообще, обычно обработка неизвестных лексем через NOTFOUND делается несколько по-другому: лексеме делается проверка типа «а это точно наша лексема?» и если это не так, то она передается дальше по цепочке предыдущему NOTFOUND.
0
Есть такое пожелание. Вот только зачем это делать? Только потому, что разработчики системы так сказали? Какой предыдущий нотфаунд надо вызывать, если никакого другого нотфаунда в данном контексте не предусмотрено? Поведение «нашей лексемы» в предлагаемом мной варианте использования нотфаунда заключается в создании этой лексемы. То-есть, она всегда «наша». Все очень красиво получается, все оттестировано и работает.
0
Вы невнимательно читали. Вариант
VALUES:
11 aa
22 bb
33 cc
;VALUES
Я не реализовывал вообще. Ввиду его бесперспективности. А так, да, конечно, если с нулевым вариантом использовать отброшенный вариант записи, эффект будет такой.
VALUES:
11 aa
22 bb
33 cc
;VALUES
Я не реализовывал вообще. Ввиду его бесперспективности. А так, да, конечно, если с нулевым вариантом использовать отброшенный вариант записи, эффект будет такой.
0
Sign up to leave a comment.
FORTH: Самоопределяющиеся слова