Вкрутил в ядро 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 кодинга, больше интерактивности!