在Steve Yegge对Design Patterns的评论中,他将Interpreter Pattern称为"开玩笑".他继续谈论编译器的看法是如何改变的,但是解释语言仍然存在,尽管我看不出它是如何与模式联系起来的.
有谁想要启发这个无知的学生?
对我来说,翻译模式听起来非常像一个被称为格林普森第十条规则的反模式:
任何足够复杂的C或Fortran程序都包含一个特殊的,非正式指定的,错误缠身的,一半Common Lisp的缓慢实现.
也就是说,如果你需要使用Interpreter,你可能会创建一些缓慢,临时和指定不当的东西.正确的解决方案是从一开始就使用正确的语言.
或者,或者,在您的应用程序中嵌入一个众所周知且语言清晰的语言,例如Guile(GNU可嵌入方案).或者使用Haskell作为嵌入式域特定语言.
但我在实践中没有看到这一点 - 您在构建自己的嵌入式语言方面有哪些经验?这是个好主意吗?它比嵌入已有的语言更好吗?
(我不是特别喜欢lisp的粉丝.这很好,但是C和Haskell以及python和很多其他语言都是如此.)
lisp design-patterns anti-patterns greenspunning interpreter-pattern
我被要求使用Composite,Recursive Descendent Parser和Interpreter创建表达式求值程序.
这是语法:
<cond> ? <termb> [OR <termb>]*
<termb>?<factb>[AND <factb>]*
<factb>?<expr> RELOP <expr> | NOT <factb> | OPAR <cond> CPAR
<expr> ? [PLUS | MINUS] <term> [(PLUS <term>) | (MINUS <term>)]*
<term> ? <termp> [(MULT <termp>) | (DIV <termp>) | (REM <termp>)]*
<termp> ? <fact> [POWER <fact>]*
<fact> ? ID | NUM | OPAR1 <expr> CPAR1
----TERMINALS----
ID ? ("A" | ... | "Z" | "a" | ...| "z") …Run Code Online (Sandbox Code Playgroud) 我很好奇知道解释器模式的一些实时示例。我可以找到一些重复的示例,例如“正则表达式”示例。有人可以引导我介绍其他示例吗?
我目前正在阅读有关解释器模式的内容,它说明了有关终端和非终端符号的内容。所以我去了维基百科并阅读了它。但我还是不明白终结符和非终结符是什么。你能给我一些编程的例子吗?我不想复制粘贴维基百科页面……我想要真实世界的例子。
我很难理解这两种设计模式。
您能否给我提供上下文信息或示例,以便我可以清楚地了解并能够映射两者之间的差异。
谢谢。