Как определить число в факторе?
Я играю с Фактором, пытаясь получить немного понимания каскадного программирования. Запись слова в квадрат для числа тривиально:
: square ( n -- n ) dup * ;
Но, судя по всему, я не могу понять, как построить число:
: cube ( n -- n ) * * ; ! Form a
Не работает, потому что предполагаемый эффект стека ( x x x -- x )
так же
: cube ( n -- n ) dup * * ; ! Form b
также не удается.
Если бы я жестко закодировал куб, я бы сделал что-то вроде этого:
3 3 * 3 *
Вот почему мое наивное предположение будет иметь форму б.
Как я уже сказал, я просто играю с Фактором и хотел бы знать, чего мне здесь не хватает - но это в основном для моего любопытства.
3 ответа
Для этого есть встроенное слово:
IN: scratchpad 3 3 ^ .
27
Или, если вы хотите написать слово самостоятельно:
: pow ( x n -- y ) 1 - over '[ _ * ] times ;
IN: scratchpad 5 3 pow .
125
Вы могли бы также сформулировать cube
с помощью square
:
: cube ( n -- n' ) dup square * ;
IN: scratchpad 6 cube .
216
В случае, если кто-то еще сталкивается с этим и хочет знать, как это сделать:
: cube ( n -- n ) dup dup * * ;
dup dup
добавит значение к вершине стека дважды, а затем * *
будет умножаться в два раза. Могу поспорить, что есть менее хакерский способ сделать это, но, как я уже сказал, на случай, если кому-то еще будет любопытно.
Это может быть интересно для вас:
: double ( n -- n ) dup + ; ! add 2 times
: square ( n -- n ) dup * ; ! multiply 2 times
Так что насчет 3 раз?
: triple ( n -- n ) dup dup + + ; ! add 3 times
: cube ( n -- n ) dup dup * * ; ! multiply 3 times
(Интересно, есть ли способ обобщить шаблон [..a a a b b b..]
)
Как насчет следующей операции более высокого порядка: Tetration:
: tetrate2 ( n -- n ) dup ^ ; ! raise to power twice
: tetrate3 ( n -- n ) dup dup ^ ^ ; ! raise to power thrice
Вероятно, вы могли бы также обобщить другой способ, реализуя гипероперации, такие как стрелка вверх Кнута. Для меня не сразу понятно, как можно поступить так, но ответ Бьёрна, кажется, намекает на это. Фактический источник имеет много уровней абстракции, оптимизирующих для разных типов данных. Нажав до тех пор, пока не достигнет (^fixnum)
дает нечто подобное