Ideas for students' summer projects

Mike Franklin slavo5150 at yahoo.com
Thu May 24 02:07:28 UTC 2018


On Wednesday, 23 May 2018 at 14:25:44 UTC, Steven Schveighoffer 
wrote:

> How do I know I'm in a function?

I don't think you're ever actually "in a function". The code is 
just data passing through the compiler.  I think what your may be 
asking is "How do I know I'm working on a function?". That 
depends on what stage in the the code->binary translation process 
your at (parsing, semantic, {not sure about others}).  Usually 
this is done with a `visit(` method.  grep for 
`visit(FuncDeclaration` or `visit(FuncExp`.  You may be deep in 
the body of a function, processing some other expression, though. 
  For that, you'll want to turn on the logging features in DMD 
when you do a build so you can see output each time an expression 
is visited; grep for `LOGSEMANTIC`.


> How do I know I'm in a template?

Same principle as above.  grep for `visit(TemplateInstance` or 
`visit(TemplateDeclaration`.

> What module am I in?

grep `visit(Module`, maybe?

I think for all of my answers above, you can also navigate up the 
AST using the `.parent` property of a symbol; see the 
dmd.dsymbol.Dsybmol class.

> How do I know what has been run?

I'd say by turning on logging in the various source files.

> What is the proper way to generate lowered code?

You're basically writing D code with D code.  The `Expression` 
class and it's derived classes are where its at.  See my failed 
attempt at lowering array literals to template here:  
https://github.com/dlang/dmd/pull/8245/files

Also my Binary Assignment Operators PR is an exemplary exercise 
in lowering:  https://github.com/dlang/dmd/pull/7079/files

Hope that helps at least a little.  It'll probably just generate 
more questions, but keep them coming.

Mike


More information about the Digitalmars-d mailing list