2014-01-15 4 views
2

Я использую Gforth, чтобы попытаться реализовать возведение в степень. Я понимаю, теоретически, как должен работать язык на основе стека. Тем не менее, у меня возникают трудности с моей реализацией его на Gforth.Выполнение возведения в степень Forth

Вот что я прямо сейчас:

: myexp 
    1 swap ?do rot dup * rot rot loop ; 

Однако, когда я запускаю его я вижу стек сгущенного как:

3 2 myexp 
:1: Stack underflow 
3 2 >>>myexp<<< 
Backtrace: 
$7F645EFD6EF0 rot 
$2 
$1 

зацикливается структура Gforth манипулирует стек, когда он петлями?

Я в темноте на том, как Forth работает, поскольку большинство примеров циклов, которые я видел в Интернете, скорее связаны и смущают кого-то нового для Forth.

Что не так с моей реализацией?

ответ

5
  • 1 swap неправ. ?do хочет нижнюю границу в верхней части стека .
  • Корпус loop неправильный. Две границы удаляются из стека данных, поэтому ваше использование rot для доступа к базе экспоненциальности не работает.
: myexp (u1 u2 -- u3) \ u3 = u1^u2 
    over swap 1 ?do over * loop nip ; 
+0

Спасибо! Не могли бы вы также объяснить, что находится в()? Я знаю текст после комментария \, но я не уверен, что должно произойти в(). – David

+3

'()' также является комментарием, поэтому вы можете разместить там что угодно. Тем не менее, существует соглашение о добавлении комментария стека к определениям. Таким образом, материал до и после '--' - это элементы в стеке до и после определения. Существуют также соглашения о том, как описывать элементы; в этом случае 'u' означает беззнаковые числа. –

+0

См., Например, http://lars.nocrew.org/dpans/dpans2.htm#2.2.2 и http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Stack_002dEffect-Comments-Tutorial.html# Stack_002dEffect-Комментарии-Tutorial –

0

Я не уверен, как использовать стек с плавающей точкой Gforth, так что я не могу дать вам ответ, но вместо того, чтобы с помощью цикла, вы можете использовать Паскаль программирования трюк определения экспоненцирование так:

x^y = exp(y*ln(x)) 

... Примечание для получения дополнительной информации см этого ответа от вопроса о Exponentiation of real numbers.