16

我刚刚阅读了一些关于 HQ9+ 编程语言的信息:

它告诉我一些关于所谓的“累加器”的信息,它可以递增,但不能访问。此外,使用+不会操纵结果,因此输入

H+H

给出结果:

Hello World
Hello World

谁能解释一下它是如何工作的,它有什么作用,以及它是否有意义?谢谢。

4

6 回答 6

14

编写了一个实现后,我想我可以毫无疑问地说它根本没有意义。我建议你不要担心;毕竟这是一种非常愚蠢的语言。

于 2010-05-04T15:04:27.487 回答
14

这是个笑话。

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

于 2010-05-04T15:39:34.043 回答
14

最近在 Clojure 中完成了一个实现(随后),我可以肯定地说,累加器绝对是成功实现 HQ9+ 的核心。没有它,就会留下 HQ9 的实现,虽然它本身无疑值得,但显然是不同的,因此没有累加器的 HQ9+ 以及递增它的指令因此不会是 HQ9+ 的实现。

编者注:Bob 今天已经服药了,但他们还没有完全发挥作用;因此,可能需要进一步解释。我相信 Bob 想说的是 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+ 被写成只接受大写字母。如果需要,我已做好充分准备建立一个宗教,暂定名为 CONVOCATION OF THE HOLY CAPS LOCK,它将宣布使用大写字母由 FRED 指挥(我们的上帝——Fred——这似乎是一个友好的名字上帝,不是吗?),并且会认为使用小写字母是诅咒......我的意思是,成为诅咒!

分享和享受。

于 2014-01-25T17:56:48.310 回答
6

它增加了一些不可访问的、非规范定义的、显然甚至没有真正使用过的东西。我想说你可以随心所欲地实施它,也可能根本不实施。

于 2010-05-04T15:16:20.143 回答
5

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

于 2014-01-22T18:35:24.030 回答
3

其实,我错了。

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

来源:

http://en.wikipedia.org/wiki/Accumulator_(计算)

当我第一次访问您问题中的第三个站点时,我很惊讶我的一位同学在页面底部编写了 OCaml 实现。

(更新的网站链接)

于 2010-10-05T08:57:39.597 回答