http://stackoverflow.com/questions/tagged/homoiconicity
---
" You might already have a language in mind that you want to use. Technically speaking, mal can be implemented in any sufficiently complete programming language (i.e. Turing complete), however, there are a few language features that can make the task MUCH easier. Here are some of them in rough order of importance:
A sequential compound data structure (e.g. arrays, lists, vectors, etc) An associative compound data structure (e.g. a dictionary, hash-map, associative array, etc) Function references (first class functions, function pointers, etc) Real exception handling (try/catch, raise, throw, etc) Variable argument functions (variadic, var args, splats, apply, etc) Function closures PCRE regular expressions
In addition, the following will make your task especially easy:
Dynamic typing / boxed types (specifically, the ability to store different data types in the sequential and associative structures and the language keeps track of the type for you) Compound data types support arbitrary runtime "hidden" data (metadata, metatables, dynamic fields attributes)
Here are some examples of languages that have all of the above features: JavaScript?, Ruby, Python, Lua, R, Clojure. " -- https://github.com/kanaka/mal/blob/master/process/guide.md
https://news.ycombinator.com/item?id=9123065 'codygman' compares various language implementations of mal using 'cloc' to see which implementations were shortest.
the shortest were:
CoffeeScript?, Clojure, OCaml, Ruby, Python
the full table was (omitting support files) was:
Language files blank comment code ------------------------------------------------------------------------------- Rust 17 294 155 3919 C 18 446 383 3356 C# 19 472 235 3314 Visual Basic 17 322 131 2945 Java 17 322 134 2872 Go 17 299 147 2636 Bourne Shell 16 304 241 2308 Perl 19 263 165 2167 Haskell 17 328 99 1951 MATLAB 25 176 114 1880 Javascript 23 263 145 1873 PHP 17 242 118 1791 Scala 16 219 113 1731 Lua 18 227 87 1715 Python 18 218 143 1393 Ruby 17 165 87 1219 OCaml 15 105 98 1154 Clojure 17 247 117 1011 CoffeeScript 17 193 126 989
(Forth is missing)
the thread https://news.ycombinator.com/item?id=9121842 discusses this and gives reasons why some of the longer implementations could have been shorter.
---
http://spinroot.com/gerard/pdf/P10.pdf rule #5 has an interesting suggestion in the context of syntax for writing assertions, where 'e' is an assertion condition (a boolean expression): "The syntax #e turns the assertion condition e into a string that is printed as part of the error message."
eg you should be able to pass around 'expressions' (which are raw ASTs, which can contain unbound variables, not necessarily written as anonymous functions with an explicit varspec), and you should be able to serialize these into strings
---
one Java metaprogramming interface in Java core:
http://docs.oracle.com/javase/7/docs/api/javax/annotation/processing/Processor.html
---
this guy claims macros are not a readability problem:
orthecreedence 2 hours ago
After programming in CL for several years, I can honestly say that when encountering new syntax that people have introduced in an app, it's no harder to follow along with it by reading the macro definition than encountering an unknown function. And when in doubt, you can just macroexpand the syntax and see what it's doing under the hood.
reply
--
kevin_thibedeau 8 hours ago
I recently needed to make a cross platform assembler for a niche 8-bit micro that only has DOS tooling. After cloning it in a small bit of Python I was looking for a simple way to extend it with macros. It turns out that m4 works really well as an asm macro language and I now have advanced facilities like a code generating expression evaluator and high level control flow statements without any significant change to the core assembler. It blows the doors off what contemporary assemblers (nasm, masm, tasm) can do and hearkens back to the high point of high level assemblers when they peaked in the 70s.
reply
---