在Io中,您可以使用以下命令设置执行上下文do
:
Http := Object clone
Http get := method(uri, ("<GET request to " .. uri .. ">") println)
Http delete := method(uri, ("<DELETE request to " .. uri .. ">") println)
Database := Object clone
Database insert := method(table, data, ("<insert data to " .. table .. ">") println)
Database delete := method(table, id, ("<delete " .. id .. " from " .. table .. ">") println)
Http do(
get("http://example.com/")
delete("http://example.com/something")
)
Database do(
insert("cats", list("Phil", "gray"))
delete("cats", 12)
)
(Ruby 具有与 类似的特性Object#instance_exec
,但它的对象模型要复杂一些。)
实际上,这为您提供了一个临时命名空间,非常适合编写特定领域的语言。有没有一种技术可以在 Haskell 中实现类似的效果(临时命名空间)?
例如,类似:(不一定完全像这样,但具有类似简洁语法的东西。)
main = do
http $ do
get "http://example.com/"
delete "http://example.com/something"
database $ do
insert "cats" ["Phil", "gray"]
delete "cats" 12
请注意,这两个delete
s 是完全不同的功能。我宁愿避免写诸如H.delete
and之类的东西D.delete
,因为那样会很快变得一团糟。我意识到可以通过将数据库版本重命名为,例如,来避免这种情况deleteFrom
,但我不想这样做。