Как считать местных жителей в ANS-Forth?

При разработке BigZ, который в основном используется для экспериментов по теории чисел, я обнаружил необходимость ортогональность в наборе слов, которые создают, фильтруют или преобразуют наборы. Я хочу, чтобы несколько слов, которые логически сочетались, покрывали широкий спектр команд, без необходимости запоминать большое количество слов и способов их сочетания.

1 100 condition isprime create-set

поместите набор всех простых чисел от 1 до 100 в стек наборов, а

function 1+ transform-set

преобразовать этот набор в набор всех чисел p+1, где p — простое число, меньшее 100.

Дальше,

condition sqr filter-set

оставляет набор всех идеальных квадратов формы p+1 в стеке.

Это работает довольно хорошо для наборов натуральных чисел, но чтобы иметь возможность создавать, фильтровать и преобразовывать наборы из n-кортежей, мне нужно уметь считать локальные числа в безымянных словах. Я переделал слова, чтобы кратко обозначить составные условия и функции:

: ~ :noname ;
: :| postpone locals| ; immediate

1 100 ~ :| p | p is prime p 2 + isprime p 2 - isprime or and ;
1 100 ~ :| a b | a dup * b dup * + isprime ;

Выполнение этих двух примеров дает стек параметров ( 1 100 xt ), но чтобы иметь возможность обрабатывать это правильно, в первом случае должен быть создан набор чисел, а во втором случае набор пар, мне придется дополнить слово :| чтобы получить ( 1 100 xt n ), где n — количество используемых местных жителей. Я думаю, что для этого можно было бы использовать >IN и PARSE, но я делал такие вещи давным-давно, поэтому я сомневаюсь, что смогу сделать это правильно в настоящее время.


person Lehs    schedule 14.08.2017    source источник


Ответы (2)


Я не понял (МЕСТНЫЕ), но с терпением и удачей мне удалось сделать это с моей первоначальной идеей:

: bl# \ ad n -- m
  over + swap 0 -rot
  do i c@ bl = +
  loop negate ;
\ count the number of blanks in the string ad n

variable loc#

: locals# \ -- 
  >in @ >r
  [char] | parse bl# loc# !
  r> >in ! ; immediate
\ count the number of locals while loading

: -| \ -- 
  postpone locals#
  postpone locals| ; immediate
\ replace LOCALS| 

В настоящее время

: test -| a b |  a b + ;

работает как МЕСТНЫЕ| но оставьте количество местных жителей в глобальной переменной loc#.

person Community    schedule 14.08.2017

Возможно, вам следует отказаться от LOCALS| и самостоятельно проанализировать локальные переменные. Для каждого вызывайте (LOCAL) с его именем и заканчивайте передачей пустой строки.

См. http://lars.nocrew.org/dpans/dpans13.htm#13.6.1.0086 для получения подробной информации.

person Lars Brinkhoff    schedule 14.08.2017
comment
Если ты так говоришь. Я не знаю, как это работает, но попытаюсь узнать. - person Lehs; 14.08.2017
comment
В документе говорится, что (local) не определено как в режиме интерпретации, так и в режиме компиляции, и, похоже, это зависит от реализации. - person Lehs; 14.08.2017