问题标签 [language-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
4716 浏览

java - 为什么 Java 没有块范围的变量声明?

以下方法不起作用,因为内部块声明了一个与外部块中的变量同名的变量。显然变量属于声明它们的方法或类,而不是声明它们的块,因此我不能编写一个简短的小临时块进行调试,碰巧将外部范围内的变量推入影子只是片刻:

几乎我用过的所有块级语言都支持这一点,包括我在学校编写的解释器和编译器的琐碎小语言。Perl 可以做到这一点,Scheme 也可以,甚至 C 也可以。甚至 PL/SQL 也支持这一点!

这个 Java 设计决策的基本原理是什么?

编辑:正如有人指出的那样,Java 确实有块作用域。我要问的概念的名称是什么?我希望我能从那些语言设计课程中记住更多。:)

0 投票
2 回答
2529 浏览

language-design - Adobe Acrobat 9 是如何制作的?

谁能说出 Adob​​e Acrobat 9 是如何制作的?我喜欢 GUI 的外观和感觉,我很好奇它是如何制作的。具体来说,使用什么编程语言来制作它?

0 投票
37 回答
1957 浏览

syntax - 你的语言“挂断”是什么?

我感兴趣地阅读了一些最近的语言与语言问题... Perl 与 PythonPython 与 Java一种语言可以比另一种更好吗?

我注意到的一件事是,我们中的很多人不喜欢语言都有非常肤浅的原因。我们第一眼就注意到了这些事情,它们让我们感到厌烦。我们回避那些可能非常好的语言,因为如果我们打扰的话,我们可能会在 2 秒内学会喜欢或忽略这些功能。

好吧,我和下一个人一样有罪,如果不是更多的话。开始:

  • Ruby:我看到的所有 Ruby 示例代码都使用该puts命令,这是一种幼稚的意第绪语解剖术语。因此,即使我应该认真对待 Ruby 代码,我也不能认真对待。
  • Python:我第一次看到它时,我对整个重要的空白都傻笑了。在接下来的几年里,我避免了它。现在我几乎不使用其他任何东西。
  • Java:我不喜欢 identifiersThatLookLikeThis。我不确定为什么。
  • Lisp:所有括号都有问题。不同重要性和目的的事物(函数声明、变量赋值等)在语法上没有区别,我懒得去学习什么是什么。
  • Fortran:大写的一切都伤害了我的眼睛。我知道现代代码不必这样写,但大多数示例代码是......
  • Visual Basic:Dim用于声明变量让我很烦恼,因为我记得 GW-BASIC 的美好时光,当时它用于维度数组。

哪些语言乍一看对我来说是正确的Perl、C、QBasic、JavaScript、汇编语言、BASH shell、FORTH。

好的,现在我已经晾干了我的脏衣服……我想听听你的。 你的语言障碍是什么?哪些肤浅的特征困扰着你?你是如何克服它们的?

0 投票
9 回答
15275 浏览

c# - 你如何强制构造函数签名和静态方法?

有没有办法强制(子)类在 C# 或 Java 中具有具有特定签名或特定静态方法的构造函数?

您显然不能为此使用接口,而且我知道它的用途有限。我发现它很有用的一个例子是当你想强制执行一些设计指南时,例如:

例外
他们应该都有四个规范的构造函数,但是没有办法强制执行它。您必须依靠像 FxCop(C# 案例)这样的工具来捕捉这些。

运算符
没有约定可以对两个类求和(在 C# 中使用 operator+)

是否有任何设计模式可以解决此限制?在未来的 C# 或 Java 版本中,可以向语言添加什么结构来克服这个限制?

0 投票
15 回答
2281 浏览

java - C、C++、Java,下一步是什么,它会是什么样子?

您认为语言的下一次演变会是什么样子?

0 投票
3 回答
822 浏览

ruby - 需要帮助改进 Ruby DSL 以控制 Arduino 控制的饮料分配器(酒吧猴子)

我正在用 Ruby 编写 DSL 来控制我正在从事的 Arduino 项目;巴迪诺。这是一个酒吧猴子,将由软件控制以提供饮料。Arduino 通过串行端口接收命令,告诉 Arduino 要打开哪些泵以及打开多长时间。

它当前读取一个配方(见下文)并将其打印出来。串行通信的代码以及我在下面提到的其他一些想法仍然需要处理。

这是我的第一个 DSL,我正在处理前面的示例,所以它的边缘非常粗糙。任何批评、代码改进(对于 Ruby DSL 最佳实践或习语有什么好的参考吗?)或任何一般性评论。

我目前有一份 DSL 的草稿,所以饮料配方如下所示(Github 链接):

这反过来被解释,目前结果如下(Github 链接):

这对于 DSL 来说是一个好的开始,但是,我确实认为它可以实现得更好一些。我有以下一些想法:

  1. 使用成分的名称和它所连接的数字泵来定义可用的“成分”。也许使用哈希?成分 = {“水” => 1,“伏特加” => 2}。这样,当一种成分被解释时,它可以 a)通过串行端口发送泵号,然后是 Arduino 分配的盎司数 b)告诉用户成分不存在并中止,因此没有分配 c)如果它们被改变,很容易有能力改变或添加新的成分。
  2. 让菜谱看起来不像代码,这是 DSL 的主要目的,也许构建一个菜谱构建器?使用可用的成分提示用户输入饮料名称、涉及的成分和多少?

Github 项目在这里,请随时 fork 并提出拉取请求,或在此处发布您的代码建议和示例以供其他用户查看。如果您完全好奇,这里是使用 Ruby Arduino 开发框架的 Arduino 代码。

更新

我修改和清理了一些东西,以反映 Orion Edwards 对食谱的建议。现在看起来如下所示。

我还添加了一个哈希(键是成分和它所连接的泵号的值)。我认为这提供了很大的进步。我暂时将这个问题留待任何进一步的建议,但最终会选择 Orion 的答案。更新的 DSL 代码在这里

0 投票
3 回答
284 浏览

syntax - 合并后运算符?

我们都熟悉前置和后置操作符,例如

以及扩展此原则的“组合运算符”:

我经常需要一个“后组合运算符”,这将允许:

显然,这仅对不可交换运算符真正有用,并且含义从前/后增量改变,即使语法是借用的。

您是否知道提供这种运算符的任何语言,为什么它不更常见?

0 投票
5 回答
271 浏览

scripting - 创建“Europanto”类型通用脚本语言的障碍是什么?

本周在几种脚本语言之间来回切换后,我发现自己在想它们有多相似。然而,我一直在寻求谷歌(或现在的 SO)来记住诸如“instanceof”和“endswith”的本地等价物是什么,或者声明接口的正确语法等细节。

这让我想起了(人类)语言Europonto。只需选择一些模糊的英语语法和一些模糊的浪漫/日耳曼语/斯拉夫语词汇,一切都很好!

那么如果我们尝试用脚本语言做同样的事情会发生什么。今天想要 Python 风格的缩进块吗?美好的!想使用原型对象吗?好的!只记得某些库函数的 PHP 名称怎么拼写?没问题!

无论如何,这是疯狂而疯狂的想法。既然我们需要一个承认具体答案的问题,让我们像这样收紧它:

在创建允许 [Python、Ruby、PHP、Perl、shell 和 JavaScript] 的所有本机语法和库函数的脚本语言时,最重要的冲突是什么,这样您就可以在语言之间自由混合代码块和函数名称?

假设任何特定的结构都应该在语句级别保持一致。所以我们允许:

但不是,说,

冲突可能包括:解析器歧义;名称冲突;对象或函数或闭包的语义冲突;等等。我猜这个范围将是一个巨大的问题,但你告诉我。

我将从一开始就将其作为“社区 wiki”开始,因此,如果您认为这是一个有趣的问题,但又想让它更加严谨,请随时进行编辑。

0 投票
43 回答
7264 浏览

programming-languages - 最有趣的非主流语言?

我对编译器、解释器和语言感兴趣。

你知道的最有趣但被遗忘或未知的语言是什么?更重要的是,为什么?

我对编译、解释和 VM 语言都感兴趣,但对Whitespace 或 BF 等深奥的语言不感兴趣。
当然,开源将是一个加分项,因为我计划学习并希望从中学习。

0 投票
3 回答
4193 浏览

programming-languages - 您将如何实施越位规则?

我已经编写了一个可以解决问题的生成器,但我想知道实现越位规则的最佳方法。

很快:越位规则在这种情况下意味着缩进被识别为句法元素。

这是伪代码中的越位规则,用于制作以可用形式捕获缩进的标记器,我不想通过语言限制答案:

此布局器一次不会生成多个 NEWLINE,并且在出现缩进时不会生成 NEWLINE。因此解析规则仍然非常简单。我认为这很好,但请告知是否有更好的方法来完成它。

虽然使用了一段时间,但我注意到在 DEDENT 之后发出换行符可能会很好,这样你可以用 NEWLINE 分隔表达式,同时保持 INDENT DEDENT 作为表达式的预告片。