Hehe, yeah I'm not a big fan either. But I've pinned the awkwardness down to the missing syntax highlighting and weird argument passing. Syntax could come "for free" with a good parser design, but argument passing is still a little bit sketchy. But I'm pretty sure, that we can find something satisfying. How Keno calls C++ functions and passes arguments in Cxx.jl doesn't look very awkward ;)
2014-11-16 21:19 GMT+01:00 Johan Sigfrids <johan.sigfr...@gmail.com>: > Yeah, that's fair. Its just something inside me that rebels against having > code inside strings. > > On Sunday, November 16, 2014 9:40:07 PM UTC+2, Simon Danisch wrote: >> >> Well, the DSL macro I sketched out would allow for that. >> Maybe, if time comes and people think this is a good idea, this could >> become an extension to normal macros? >> But first of all, a prototype is needed anyways... How deeply the >> prototype will be integrated later on depends on the feedback, I guess. >> >> 2014-11-16 20:01 GMT+01:00 Johan Sigfrids <johan.s...@gmail.com>: >> >> Your right. That is a problem. Is there no way to extend Julia so that >>> you can create a macro that automatically uses a custom parser? >>> >>> On Sunday, November 16, 2014 5:26:26 PM UTC+2, Simon Danisch wrote: >>>> >>>> No! The expression between *begin ... end* must still be valid Julia >>>> syntax, which is why you need to tell Julia, not to parse it into a Julia >>>> AST, but into some intermediate representation. >>>> @Scala begin >>>> person match { >>>> ERROR: syntax: extra token "match" after end of expression >>>> >>>> >>>> 2014-11-16 16:18 GMT+01:00 Johan Sigfrids <johan.s...@gmail.com>: >>>> >>>> Would it be impossible to simply have something like: >>>>> >>>>> @Scala begin >>>>> >>>>> person *match* { >>>>> *case* Person("Hans","Meyer",7) => "Found: Hans Meyer" >>>>> * case* Person("Heinz","Mustermann",28) => "Found: Heinz >>>>> Mustermann" >>>>> * case* *_* => "Unknown Person" >>>>> } >>>>> end >>>>> >>>>> >>>>> Without having to have the multiline string thing or DSL call? >>>>> >>>>> On Saturday, November 15, 2014 11:55:15 PM UTC+2, Simon Danisch wrote: >>>>>> >>>>>> Hi, >>>>>> I was thinking about Domain Specific Languages lately from different >>>>>> perspectives and concluded, that we could "easily" make Julia an awesome >>>>>> home for DSL's. (Domain Specific Languages) >>>>>> Why would Julia benefit from a good infrastructure for DSL's? >>>>>> >>>>>> *1.)* >>>>>> Rapid prototyping of language concepts. >>>>>> I was considering Mauro's trait implementation lately, and I didn't >>>>>> want to use it, because it just looked a little cumbersome (no offense, >>>>>> its >>>>>> just a little difficult with only macros!). >>>>>> If he was able to implement the prototype first with a DSL, he could >>>>>> have already created a syntax prototype for it and thinks could have >>>>>> looked >>>>>> more concise and inviting. >>>>>> >>>>>> *2.)* >>>>>> Writing in different languages inside Julia, for example Assebler, >>>>>> OpenCL kernels, OpenGL shader, etc... >>>>>> function foo(a::Float32, b::Float32) >>>>>> @DSL Assembler(a, b)""" >>>>>> push RBP >>>>>> mov RBP, RSP >>>>>> vaddss XMM0, XMM0, XMM1 >>>>>> pop RBP >>>>>> ret >>>>>> """ >>>>>> end >>>>>> I know you might ask, why this is a good idea, as LLVM should be >>>>>> tuned, to emit the best native code. >>>>>> But lets assume that it doesn't! Then, a person can already prototype >>>>>> how the code emitted by LLVM should look like, and another person, who >>>>>> probably knows LLVM a lot better, can do the appropriate changes to >>>>>> LLVM/Julia. >>>>>> >>>>>> *3.)* >>>>>> Classic use cases like a specialized UI languages, first order logic, >>>>>> other mathematical constructs, scripting, etc... >>>>>> >>>>>> *4.)* >>>>>> Stealing nice syntactic concepts from other language, to see if they >>>>>> give Julia any advantages, without a big hassle. >>>>>> function isspecificperson(person) >>>>>> @DSL Scala""" >>>>>> >>>>>> person *match* { >>>>>> *case* Person("Hans","Meyer",7) => "Found: Hans Meyer" >>>>>> *case* Person("Heinz","Mustermann",28) => "Found: Heinz Mustermann" >>>>>> *case* *_* => "Unknown Person" >>>>>> } >>>>>> >>>>>> """ >>>>>> >>>>>> *Possible disadvantages: * >>>>>> If widely used, code will get harder to read, as you need to learn >>>>>> all the crazy DSL's users are creating. >>>>>> But this will happen anyways, and it's probably better to do it in an >>>>>> orderly fashion than ;) >>>>>> >>>>>> *Implementation Sketch:* >>>>>> >>>>>> macro DSL(name, text) >>>>>> tokens = *dsltokenizer*(DSLTokens{name}(), text)::DSLTokens{name} >>>>>> dslast = *generate_ast*(tokens)::AST{name} >>>>>> return *dsl*(dslast)::AST{:Julia} >>>>>> end >>>>>> >>>>>> # Default implementations: >>>>>> *dsltokenizer*(::DSLTokens, text) = ... # Default probably with Jake >>>>>> Bolewkis Lexer?! >>>>>> *generate_ast*(text::DSLTokens) = ... >>>>>> *dsl*(ast::AST) = ... >>>>>> #Depending on the complexity of your DSL, overwrite any of these >>>>>> stages, to implement your own DSL, otherwise use default >>>>>> >>>>>> >>>>>> It seems like Jake Bolewski has already implemented a lot to make >>>>>> this work. >>>>>> Probably it would be nice to integrate OpenCL kernel code like this ;) >>>>>> My hope would also be, to pair this with meta data on the different >>>>>> stages, to make it very easy to supply correct syntax >>>>>> highlighting/correction for the different DSL's. >>>>>> Creating the ast and tokenizing things otherwise needs to be done >>>>>> twice, one time for the system and one time for an IDE. >>>>>> Or are there currently simple ways in Julia, to determine where >>>>>> tokens are in a string, what scopes there are and what kind of attribute >>>>>> println is in "println("1234")" ? >>>>>> I haven't found them yet. Most of the things you would currently need >>>>>> to implement for this, will be redundant to "parse" and are then volatile >>>>>> to changes in the language. >>>>>> >>>>>> Well these are just some thoughts I recently had, feel free to >>>>>> evaluate this and/or judge if this is something we really want! >>>>>> I won't implement this anytime soon, but maybe someone searching for >>>>>> a bachelor/master thesis comes to the rescue? >>>>>> Who knows... >>>>>> >>>>>> Cheers, >>>>>> Simon >>>>>> >>>>> >>>> >>