2

背景:最近在查看“结构化文本编辑器”时,我注意到他们使用了一个技巧来更改 python/perl/c++/java 等。通过将 XML 潜入相应语言的注释中,形成一个“结构化”大纲。

我记得曾经在 Windows bat 文件中看到过这个技巧。bat 文件的 REM 语句用于“隐藏”一些 perl 代码。

问题:您是否见过有人使用编程或标记语言的注释来嵌入完全不同语言的语法的实例?如果是,您能否提供该示例的链接或解释它是什么?

如果你还没有,这里有一个例子:

问题:这种“技巧”是一个聪明有用的想法吗?如果是这样,你能列举一个你使用这个技巧的特殊实例吗?如果不是,你能描述为什么你认为这是一个坏主意吗?

4

7 回答 7

3

您说的是polyglots,这是计算机编程的一个绝对迷人的方面,也是对某些脚本/编程语言的模棱两可性质的精彩练习。虽然绝对是一个有趣的概念,但它们很少出现在新奇领域之外。然而,从编码员的角度来说,让你的工作在几个截然不同的环境中发挥作用绝对是一项壮举。然而,由于多语种人通常通过评论依赖各种技巧和变通方法,这几乎总是超出了可行性范围。但是,如果您还没有看到他们可以做什么,那么绝对值得一看;我会推荐这个

信不信由你,该单个文件将正确编译(以某种方式、形状或形式)为十五种不同的语言:

  1. HTML
  2. 重击
  3. zsh
  4. C89
  5. C99
  6. C++
  7. 生成文件
  8. 红宝石
  9. Tcl
  10. Perl
  11. 哈斯克尔
  12. Python
  13. JavaScript
  14. 脑残
  15. 空白
于 2009-02-04T01:10:14.603 回答
2

我不能给你一个完整的答案,但是 Netbean 喜欢在他们的 Java 生成代码中使用这个技巧。

问题是,Java 源代码应该是应用程序之间的媒介。通过为某些评论添加含义,您将被迫仅使用 Netbeans。当然这些评论可以被其他程序忽略,但是如果这些评论被移动或改变了怎么办?我已经在 Netbeans 中做到了,然后当我尝试将文件加载回 Netbeans 时发生了一些奇怪的事情。我不得不花时间修复我认为不可见的语法(在评论中!)。

就个人而言,如果现有文件需要多次非本地修改,我永远不会为它添加更多含义(意思是,可以在一个评论中具有含义,但从该评论到该评论没有意义)。在大多数情况下,我肯定会添加另一个包含所需元数据的文件。

于 2009-02-04T01:07:28.087 回答
1

这种恐怖插入了有效的 XHTML、HTML 和 HTML3.2 之前的 tagoup '隐藏' 标记与 CSS 注释:

<style type="text/css"><!--/*--><![CDATA[/*><!--*/
    ...
/*]]>*/--></style>

当我开始看到它实际使用时,我感到羞愧。这只是作为一种练习。对不起。

于 2009-02-04T01:38:45.590 回答
1

我已经看到这个技巧(在评论中隐藏东西)用于在编辑器中折叠,在各种工具中进行文档标记,以及在建模工具中为往返工作留下面包屑。

我见过的另一个用途是在Cog中,一个代码生成器。你在注释中编写 python,然后 Cog 运行 python 来生成代码。这很有趣,因为重点是永远不需要/不想修改生成的代码,因此它不会遇到与您遇到的相同的烦恼,例如,当您不小心弄乱“折叠”注释时,折叠编辑器在不同的编辑器中。

于 2009-02-04T01:53:33.157 回答
1

Visual Studio 有一种称为 T4 的形式。不幸的是,文档有点粗略。

于 2009-02-04T02:00:44.470 回答
1

Python 文档中使用的一种最喜欢的标记是Restructured Text。它是一种通用的简化标记语言,如 Markdown 或 Textile,但它具有良好的文档结构,并且可以轻松用于生成 HTML 或 PDF 文档。

于 2009-02-04T02:07:07.843 回答
1

Donald Knuth 的 WEB 和 CWEB 在 TeX 中嵌入了 Pascal (WEB) 和 C (CWEB)。以下是 METAFONT 源代码中的示例:

@ The following system-independent code makes the |xord| array contain a
suitable inverse to the information in |xchr|. Note that if |xchr[i]=xchr[j]|
where |i<j<@'177|, the value of |xord[xchr[i]]| will turn out to be
|j| or more; hence, standard ASCII code numbers will be used instead of
codes below @'40 in case there is a coincidence.

@<Set init...@>=
for i:=first_text_char to last_text_char do xord[chr(i)]:=@'177;
for i:=@'200 to @'377 do xord[xchr[i]]:=i;
for i:=0 to @'176 do xord[xchr[i]]:=i;
于 2009-02-04T03:19:31.317 回答