【问题标题】:Implement SWAP in Forth在 Forth 中实现 SWAP
【发布时间】:2013-11-22 09:15:56
【问题描述】:

我在interview with Chuck Moore 中看到了这一点,他说:

操作该堆栈的单词是 DUP、DROP 和 OVER 句点。 没有,好吧 SWAP 很方便,你想要,但不是 机器指令。

所以我尝试仅用DUPDROPOVER 来实现SWAP,但不知道怎么做,至少不增加堆栈。

这是怎么做到的,真的吗?

【问题讨论】:

  • @AndréLaszlo 他的观点是,SWAP 是根据其他指令实现的,例如 DUP、DROP 和 OVER。但是如何在不增加堆栈的情况下做到这一点呢?
  • @AndréLaszlo 不,从堆栈'1 2'开始,没有办法以堆栈'2 1'结束,只使用他提到的那3条指令。您可以使用 OVER 来获得 '1 2 1',但这不是 '2 1'。
  • 我在这里试过1 2 OVER DROP . . forthfreak.net/jsforth80x25.html 似乎有效?
  • @AndréLaszlo 这样你又会得到1 2。重点是交换它们。
  • @AndréLaszlo 这似乎是这样做的方法,看到接受的答案,它从来没有发生在我身上。

标签: forth


【解决方案1】:

你是对的,仅仅 dup、drop 和 over 似乎很难或不可能。

我猜 i21 可能也有某种返回堆栈操作,所以这会起作用:

: swap   over 2>r drop 2r> ;

编辑:在也没有本地交换的 GA144 上,它的实现方式为:

over push over or or pop

Pushpop 指的是返回栈,or 实际上是异或。见http://www.colorforth.com/inst.htm

【讨论】:

  • 确实,在 F18 上,这是进行swap (over push over or or pop) 的一种方式。另一个可能是over push push drop pop pop。还有一个,指令较少但使用 A 寄存器,可能是push a! pop a
  • 我还要提一下,基本上结束是 已经 一种swap ,除了它留下了一个值。不过他的筹码有圆形筹码,所以有时这不是问题。或者,您可以稍后在使用最高值后使用drop 进行清理。所以说真的,over 在很多情况下被用来代替swap
【解决方案2】:

在标准 Forth 中是

: swap ( a b -- b a ) >r >r 2r> ;

: swap ( a b -- b a ) 0 rot nip ; 

: swap ( a b -- b a ) 0 rot + ;

: swap ( a b -- b a ) 0 rot or ;

【讨论】:

    【解决方案3】:

    Charles Moore 的这句话很容易被误解,因为它是在他的 Forth 处理器的上下文中。 SWAP 不是硬件 Forth 处理器的机器指令。一般来说,在 Forth 中,一些定义是根据其他定义来定义的,但这以某些所谓的原语结尾。在 Forth 处理器中,这些是在硬件中实现的,但在所有 Forth 实现中,例如主机系统或单板计算机,它们由一系列机器指令实现,例如英特尔:

    CODE SWAP pop、ax pop、bx push、ax push、bx END-CODE

    他还使用了“方便”一词,因为 SWAP 通常是可以避免的。在这种情况下,您需要处理两个数据项,但它们不是您想要的顺序。 SWAP 意味着一种精神负担,因为您必须想象堆栈内容发生了变化。人们通常可以通过使用辅助堆栈来临时存放您现在不需要的物品来保持堆栈平直。或者,如果您需要一个项目两次 OVER 是更可取的。或者一个词可以有不同的定义,它的参数有不同的顺序。

    用 4 个 FORTH 字而不是 4 个机器指令来实现 SWAP 显然会适得其反,因为这些 FORTH 字每个都必须由几个机器指令本身实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2014-10-06
      • 2010-10-07
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多