Spiiin's blog

Daslang Jupyter - dastrudel, macro workbench

Вкрутил в ядро jupyter для daslang пару полезных фич.
Теперь на нём можно в live общаться с клиентом dastrudel и программно писать музыку.

пример live-coding

Также можно в одной ячейке написать макрос, а в другой проверять его, несколько magic-команд для раскрытия и pretty-print отображения.

%%writefile notebook_macros.das
options gen2
module notebook_macros public
require daslib/ast
require daslib/ast_boost
require daslib/templates_boost
require daslib/macro_boost
require daslib/ast_verify
[call_macro(name="plus_one")]
class PlusOneMacro : AstCallMacro {
    def override visit(prog:ProgramPtr; mod:Module?; var expr:ExprCallMacro?):ExpressionPtr {
        macro_verify(length(expr.arguments)==1, prog, expr.at, "plus_one expects one argument")
        var result <- qmacro($e(clone_expression(expr.arguments[0])) + 1)
        verify_expression(result)
        return <- result
    }
}

Отображение в виде AST

%%ast
value=999
var temporary=plus_one(value)
print("THIS MUST NOT RUN")

// After type inference and macro expansion; optimizer disabled.
Function <cell>
  ExprBlock
    ExprCopy : void
      ExprVar : int& -const  value
      ExprConstInt : int const  999
    ExprLet
      ExprOp2 : int const
        ExprRef2Value : int -const
          ExprVar : int& -const  value
        ExprConstInt : int const  1
    ExprCall : void
      ExprConstString : string const  "THIS MUST NOT RUN"
      ExprFakeContext : __context const  __context__
      ExprFakeLineInfo : __lineInfo const  __lineinfo__
    ExprReturn : void

Отображение в виде переписанного кода

%expand plus_one(value)
// After type inference and macro expansion; optimizer disabled.

/*FULLY INFERRED*/
// [access_global]
[export]
[$::export]
def public inspected_cell : int const {
	return value + 1;
}

Больше live кодинга, больше интерактивности!