可以在语言中干净地实施隐含主题吗?

时间:2011-08-15 13:21:15

标签: php perl language-design implicit

我感到很无聊,所以我开始在Perl 5.14中创建自己的HTML模板语言,因为我可以。

这个问题是关于特定功能的解析器实现特定语言结构的可行性,这在语言中很少见。

编辑:在请求时删除了关于PHP的残忍和完全不必要的评论。

编辑2:变成了一个更客观的问题。

PHP动态处理HTML的简单性是一种优势,尽管任何50000行框架用户都可以这么说。

无论如何,我在考虑隐含主题如何在这种语言中起作用。 Perl通过$ _来获得它们,但是它们有点令人讨厌 - 它们是不一致的,必须通过原型明确允许它们,并且它们通过引用变量暴露给用户,更不用说必须找出哪个内置插件使用它们,哪些不使用它们。

我所说的是将隐含主题的概念直接引入语言,并使用一些非常明确的规则。例如。所有迭代构造都为每个元素分配它,闭包使用它作为第一个参数(一种让Ruby-do块优雅的简单方法)。

现在,这是关键位:不是定义默认的'it'变量,而是定义严格的语义,其中默认主题是推断的,而不是。例如,参数少于预期的函数将使用它作为第一个参数。管他呢。您不通过变量公开主题,而是通过语言

在像Lisp或Ruby这样的语言中,这很难做到,因为他们并不喜欢像循环那样的语言级构造,而是喜欢自己的方式,无论是宏还是块+方法。

但是在一种包含像Perl这样的语言连接结构的语言中,这可以很好地工作。

但是,这是另一回事,如果有一个新主题被讨论,语言会强迫你明确地引用事物。例如,如果你有一个for循环,内循环的主题将是它自己的当前元素,而不是外部当前元素。 Perl用户已经这样做了,但其他语言用户可能不熟悉这个概念。

那么,隐式主题是否可以干净地实现为一种语言,使用范围主题迫使编码器在不明确时显式化?

这在英语中很有意义。如果我们讨论其他问题,我们会深入研究子主题,然后我们“回顾”'超级'主题,然后明确说明主题是我们之前讨论的内容。然后它会自动再次表示“超级”主题。我们的演讲是动态范围的!

另外,对我来说,尝试解析这个问题最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

编程语言中有各种级别的隐式主题。

在最小的方面,你有Javascript的this设置和Ruby在方法中self的设置。

在另一个极端,你有像J这样的语言,每个角色都会强制执行隐含在应用数据周围的动作。

中间的某个地方是像Perl这样的语言,提供了许多隐式操作,但也允许您明确表达您需要的任何内容。

所有Perl的foreach构造(foreach循环,map,grep)都使用$_作为主题变量。许多内置版本默认使用$_。子例程使用@_作为主题变量,默认情况下,几个内置函数使用@_

我建议你花一些时间来学习如何在Perl中使用topicalizers和context来消除无关和冗余的语法。因为据我所知,你所寻找的一切都已经成为Perl的一个特性,你可以正确地使用这些功能,并训练自己不要使用那些违背这个目标的功能(这是一个很大的功能)毕竟语言不是每个功能都是为简洁代码设计的。)

相关问题