haskell - 举例说明实际的括号 hell 程序

标签 haskell lisp parentheses

有些人可能熟悉 Parenthesis Hell (代码 here )。好吧,这是在晚上打电话之间浪费时间的好方法,对吧?

这五个文件我都是用ghc编译成功的。如果我运行,解释器似乎可以工作

$ ./ph

但是由于我不太了解 Lisp/cdr/car 的东西,所以我很快就在尝试编写一个功能性程序时遇到了麻烦。我认为至少其中一些应该将一些东西打印到标准输出...

$ ./ph () ()
-bash: syntax error near unexpected token `)'
$ ./ph () (3)
$ ./ph () (())
$
$ ./ph (()())
-bash: syntax error near unexpected token `('
$ ./ph "()()"  # suggestion in comment
ph: ()(): openFile: does not exist (No such file or directory)
$ ./ph  # actual behavior with returns
()
()
ph: Prelude.read: no parse

不用说,任何在“文档”中使用 Hello World 的尝试都会导致大量“接近意外标记的语法错误”消息。有任何想法吗?或者一切都评估为 nil 所以这只是一个精心设计的 Lisp joke ,除了两个实际的编译器?谢谢!

(注意:Lisp 爱好者将通过教更多人如何解释这个括号内容来提供服务,我不得不承认无论如何在完全不同的上下文中这对我来说都是有用的。)

编辑 2:@dfeuer 至少有一个有效的解决方案,尽管我想知道是否可以从 shell 交互使用。

$ cat hello
(()()(()()(()()()()((()()(()(()((()((()()()((()((()()()((()((((()()(()()()()()()(((()(((()((()((((()(((()()(()()((()((()()()((()()(()()()()(()()()()(()()()()(()(())))))))))))))))))))))))))))))))))))))))))))))))))
$ ./ph hello
Hello world!

奇怪但又很棒。

最佳答案

我认为它不需要在其参数中包含代码。在我看来,它像是在寻找文件名(以及一个名为 -v 的命令行选项)。

似乎每个程序只接受一个带括号的表达式。所以像 () (()) 这样的东西是无效的,但是 (() (())) 是可以的(或者至少是格式正确的)。如果你想从命令行使用它,你可以使用 echo 因为它也从标准输入读取:

echo "(()()(()()(()()()()((()()(()(()((()((()()()((()((()()()((()((((()()(()()()()()()(((()(((()((()((((()(((()()(()()((()((()()()((()()(()()()()(()()()()(()()()()(()(())))))))))))))))))))))))))))))))))))))))))))))))))" | ./Test

关于haskell - 举例说明实际的括号 hell 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27559368/

相关文章:

haskell - 奇怪的模式匹配 : is it correct?

functional-programming - 如何让我的大脑在 "lisp mode?"中移动

c++ - 关于c++中的括号

haskell - Haskell中的Eta减少

haskell /GHC : How to write predicates on type-level naturals

string - 字符 ' ' 处的字符串/字 rune 字中的词法错误?

emacs - 如何在 elisp 中用变量替换硬编码字符串?

lisp - DrRacket 解释器是否使用基于 SICP 练习 1.5 的正常顺序评估?

if-statement - 字 'if' 解释为 'if()' 函数调用。 parent 不允许

python - 为什么某些 Python 函数在参数列表周围有一组额外的括号?