Paul gave an excellent overview. I would also describe the ability of CL of "re-plumbing" itself (shameless plug: the DEFINER library :) ) and, of course, as a standard example from ages ago, Prolog-like languages and the slew of logic languages build on top of CL.
cheers MA On Jul 20, 2011, at 18:47 , Paul Tarvydas wrote: > It seems to me that most people don't understand the rudiments of CL's > ability for creating DSL's and live in the land of Blub. > > If you're going to discuss creation of DSLs, it might be an idea to first > relate the aspects of CL using compiler terminology. > > Here are some random thoughts (not all are accurate, but represent an attempt > to translate CL concepts into Blub): > > - CL is a language that has Lex and Yacc built into it. You can change the > syntax of CL to suit your problem. > > - Lisp s-expressions are concrete parse trees. > > - The CL "reader" is a scanner. You don't need to build a scanner, since CL > already provides you with one. > > - CL symbols are "tokens". > > - The CL scanner can read programs from a number of sources - not just files > - e.g. strings, keyboard, streams, etc. > > - Physicists commonly create DSL's. They define a notation with which to > describe a domain, then use the notation to solve problems in the domain. > > - Few other languages can change their own syntax. Examples of > self-modifying syntax can be found in term-rewriting systems, such as the > language TXL. > > - CL macros are parsers. > > - CL macros are code emitters. > > - CL macros are source-to-source program transformers. > > - CL backquote/comma/at-sign notation is used to splice and modify concrete > parse trees into other shapes. > > - The CL compiler compiles s-expressions into machine code. > > - If one creates s-expressions, one can use the CL compiler to compile them > into machine code at runtime. > > - The CL compiler is a JIT compiler. > > - The CL repl interactively compiles s-expressions to machine code, then > executes them, then prints the results of the execution. > > - The CL language defines a rich library of operators for modifying concrete > parse trees. > > - To a CL'er, infix notation is just unnecessary syntactic sugar. Many > novice CL'ers try to create macros that understand infix notation early on in > their careers, but as they become more familiar with the power of CL, they > drop the syntatic sugar and use parse trees directly. > > - The CL printer contains a notation for displaying structure sharing. This > facilitates debugging of optimizers which transform trees into graphs. > > - To write a DSL in CL, one first writes a macro that parses s-expressions. > Then, the macro is extended with backquotes to emit new s-expressions. The > emitted s-expressions are automatically fed to the CL compiler and compiled > to machine code. > > - Unfortunately, the C language uses the name "macro" for a facility that is > far less powerful than that of CL. In C, the macro facility can only parse a > syntax that looks like simple symbols and function calls and a special #if > syntax that is not even part of the C language definition. In CL, the macro > facility can parse any s-expression and utilitize any CL function during code > emission. > > - With C macros, the programmer does not have the option to change the syntax > of the macro language. With CL macros, the programmer has full control of > the macro syntax. > > - CL has the ability to link/load modules at runtime, "on the fly". > > - CL invented the concept of JIT (is this factually true?). > > - Forward references in CL are automatically handled by the runtime linker. > The linker fixes up references on the fly to improve runtime efficiency (I > know that I first saw this facility in UTAH Lisp in 1977). > > - The CL scanner, compiler and linker sit in memory all (most) of the time, > hence, CL is an all-in-one bundled DSL/compiler toolkit. Some CL's give you > the ability to remove the compiler when creating a .exe, if you no longer > need it. > > - The builtin CL macroexpand function gives the programmer the ability to > debug his/her DSL compiler by viewing the emitted code (much like CPP's > command line option that leaves the expanded code in a text file). > > - CL's rich suite of syntactic and compiler tools came about due to early AI > research into automatic code generation. > > - CL lambdas (closures) are thunks. > > - CL closures are trampolines. > > - CL closures and Scheme's call-with-continuation are the ultimate goto's. > Any control flow can be modelled and compiled with these facilities. > > - CL closures and Scheme's call-with-continuation can be used to create > compilers using the concepts of denotational semantics. > > - Cl closures are (kind of) like Smalltalk's "blocks". > > - CL closures are another example of the rich language-building facilities of > CL, not commonly found in most languages. > > - CL closures can be used to create anonymous functions, similarly to > anonymous classes used in Java. > > - The facilities of CL make it possible to model and compile just about any > kind of runtime semantics, including very non-linear ones, e.g. PAIP prolog. > > - Prolog provides an simple way to build parsers, if efficiency is not of > utmost concern. A number of prologs are available to CL programmers, so one > can have the best of both worlds. [I use paip prolog to parse diagrammatic > syntax.] > > hth > > pt > > _______________________________________________ > pro mailing list > pro@common-lisp.net > http://lists.common-lisp.net/cgi-bin/mailman/listinfo/pro -- Marco Antoniotti, Associate Professor tel. +39 - 02 64 48 79 01 DISCo, Università Milano Bicocca U14 2043 http://bimib.disco.unimib.it Viale Sarca 336 I-20126 Milan (MI) ITALY Please note that I am not checking my Spam-box anymore. Please do not forward this email without asking me first. _______________________________________________ pro mailing list pro@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/pro