HQ9 +中的'累加器'是什么?

时间:2010-05-04 14:59:52

标签: accumulator

我刚刚读了一些关于HQ9 +编程语言(http://esolangs.org/wiki/HQ9http://en.wikipedia.org/wiki/HQ9%2Bhttp://www.cliff.biffle.org/esoterica/hq9plus.html)的内容,它告诉我一些所谓的'累加器',它可以递增,但不能访问。此外,使用+不会操纵结果:

H+H

结果

Hello World
Hello World

任何人都可以解释一下这是如何工作的,这是什么以及它是否有意义?感谢

6 个答案:

答案 0 :(得分:13)

这是个玩笑。

还有一个面向对象的HQ9 +扩展,称为HQ9 ++。它有一个新的命令++,它实例化一个对象,并且出于向后兼容的原因,还会将累加器寄存器递增两次。而且,由于无法存储,检索,访问,操纵,打印或以其他方式影响对象,因此它完全没用。

答案 1 :(得分:12)

写了一篇implementation之后,我想我可以毫无疑问地说它毫无意义。我建议你不要担心;毕竟,这是一种非常愚蠢的语言。

答案 2 :(得分:10)

最近在Clojure中完成了一个实现(接下来),我可以肯定地说,累加器对于成功实现HQ9 +来说是绝对重要的。如果没有它,我们将留下一个HQ9的实现,虽然HQ9本身无疑是值得的,但显然是不同的,因此没有累加器的HQ9 +以及递增它的指令因此 NOT HQ9 +的实施。

编者注:鲍勃今天已服用他的药物,但他们还没有完全开始;因此,可能需要进一步解释。我认为鲍勃试图说的是HQ9 +作为一种编程是无用的语言,本身;然而,实现它实际上可以在学习如何用新语言成功实现某些东西的环境中有用。好的,我现在就在Bob的大脑背后悄悄地蜷缩起来让他得到回到做......当我不在商店的时候,无论他做什么...... )。

无论如何......在Clojure中的实现如下:

(defn hq9+ [& args]
  "HQ9+ interpreter"

  (loop [program      (apply concat args)
         accumulator  0]
    (if (not (empty? program))
      (case (first program)
        \H (println "Hello, World!")
        \Q (println (first (concat args)))
        \9 (apply println (map #(str % " bottles of beer on the wall, "
                                      % " bottles of beer, if one of those bottles should happen to fall, "
                                      (if (> % 0) (- % 1) 99) " bottles of beer on the wall") (reverse (range 100))))
        \+ (inc accumulator)
            (println "invalid instruction: " (first program)))) ; default case
    (if (> (count program) 1)
       (recur (rest program) accumulator))))

请注意,此实现仅接受作为参数传递给函数的命令;它不读取其程序的文件。这可能在将来的版本中得到补救。另请注意,这是该语言的“严格”实现 - 原始页面(Wayback Machine)清楚地表明只有大写的'H'和'Q'应该被接受,尽管它意味着也可以接受小写字母。由于实现任何编程语言的部分要点是严格遵守规范,因此编写此版本的HQ9 +只能接受大写字母。如果有需要,我已经做好充分的准备,找到一个宗教,暂定名为“圣帽锁定”,它将宣布使用大写由FRED命令(我们的上帝 - 弗雷德 - 它似乎是一个如此<强者>友好的上帝的名字,不是吗?),并且会认为使用小写字母是诅咒......我的意思是,要成为安息日!

分享并享受。

答案 3 :(得分:5)

它增加了一些不可访问的东西,而不是规范定义的东西,显然甚至没有使用过。我会说你可以实现它,无论你想要什么,或者根本不可能。

答案 4 :(得分:4)

正确的答案是其他答案暗示的答案,但没有明确说明:增加累加器的效果未被语言规范定义,而是作为实现的选择。

答案 5 :(得分:2)

实际上,我错了。

累加器是存储最后一次计算结果的寄存器。在Intel x86中,任何寄存器都可以指定为累加器,但MUL的情况除外。

来源:

http://en.wikipedia.org/wiki/Accumulator_(computing)

我第一次在您的问题中访问the third site以找到我的同学在页面底部写了OCaml实现时,我感到非常惊讶。