举例说明实际的括号地狱计划

时间:2014-12-19 03:39:37

标签: 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

毋庸置疑,任何在“doc”中使用Hello World的尝试都会导致许多“意外令牌附近的语法错误”消息。有任何想法吗?或者所有内容都评估为nil,所以这只是一个精心设计的Lisp joke,除了两个实际编译器?谢谢!

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

编辑2:@dfeuer至少有一个有效的分辨率,但我想知道是否可以从shell中以交互方式使用。

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

奇怪且又棒极了。

1 个答案:

答案 0 :(得分:2)

我认为它不希望代码出现在其论点中。它看起来像是在查找文件名(以及名为-v的命令行选项)。

似乎每个程序只接受一个带括号的表达式。因此() (())之类的内容无效,但(() (()))可以(或者至少格式良好)。如果要从命令行使用它,可以使用echo,因为它也从stdin读取:

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