【发布时间】:2020-02-29 10:25:36
【问题描述】:
它...对你们有点用(这绝对编译,改编自https://hackage.haskell.org/package/scotty):
main :: IO ()
main = (do
(putStrLn "Starting Server....")
(scotty 3000 (do
(get "/hello/:name"
(text ("hello " <> (param "name") <> "!")))
(get "/users"
(json allUsers))
(get "/users/:id"
(json (filter (matchesId (param "id")) allUsers))))))
(我不知道足够的 haskell 将 <> 转换为简单的括号,但聪明的人可以轻松做到。)
我们为什么要这样做?我们可以使用任何 lisp 宏引擎对 Haskell 进行预处理!微不足道!。
想象一下。 HASKELL 和 LISP 在一起。我们可以统治银河!
(我知道你的想法,但实际上我已经考虑过了:在这个例子中,Vader 是 Lisp,Luke 是 Haskell,Yoda 是 Alonzo Church)
(编辑“感谢所有回答和评论的人,我现在聪明多了。 我认为这种技术的最大问题还没有被提及,并且被朋友 IRL 指出:如果您编写一些 lispy 预处理器,您将失去 IDE 和工具中的类型检查、语法突出显示和理解。这听起来像是我的硬传。”
“我现在关注https://github.com/finkel-lang/finkel项目,这是我想要的lisp风格的haskell项目!”)
【问题讨论】:
-
因为 Lisp 使用了太多的括号,使其非常不可读。
-
/rant (1) 所有语言都可以用 Lisp 符号来表达,但人们有不同的品味。就我个人而言,我发现 Haskell 不可读,我更喜欢单词而不是 Perlisms,并且更喜欢不必记住哪个运算符优先于其他运算符,但这不是 Haskell 的优点(请参阅箭头语法、组合符等)。从视觉上讲,我希望 Haskell 采用完整的 Unicode 并使用现有的数学运算符,如 APL。 (2) 据我所知,Haskell 用户似乎不太重视元编程。
-
这是一个在 Racket 中编写类似 Haskell 语言的实验:github.com/lexi-lambda/hackett
-
我不确定它是否真的让你买了很多东西。您的宏仍然需要了解所有特殊的语法形式——例如,您不想对作为模式的语法位与作为表达式的语法位运行相同的递归操作,因此您不能只写一个在转换后的
let表达式的位上统一工作的宏——因此对文本的统一序列化实际上并没有帮助。 -
单独使用单词可能会走得太远(参见 Python);尝试添加新功能成为尝试尽可能多地重用现有关键字的冒险(以避免破坏假定单词可用作标识符的代码),这种方式不会与关键字的现有用途产生歧义。符号有其位置;正确的答案既不是使用不足也不是过度使用。
标签: haskell macros lisp defmacro