При разработке 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, но я делал такие вещи давным-давно, поэтому я сомневаюсь, что смогу сделать это правильно в настоящее время.