module Yadriggy::Py

Python language embedded in Ruby

Constants

Syntax

Public Class Methods

expr_or_subtype(ast) click to toggle source
# File lib/yadriggy/py/python.rb, line 53
def self.expr_or_subtype(ast)
  if ast.nil? || ast.is_a?(Assign)
    false
  else
    usertype = ast.usertype
    if usertype == :fun_call
      ast.name.name != 'print'
    else
      usertype == :expr || usertype == :lambda_call || usertype == :ternary
    end
  end
end
generate_except_last(ast, gen) click to toggle source
# File lib/yadriggy/py/python.rb, line 38
def self.generate_except_last(ast, gen)
  if expr_or_subtype(ast)
    ast
  elsif ast.is_a?(Exprs) && expr_or_subtype(ast.expressions[-1])
    ast.expressions[0...-1].each do |e|
      gen.print(e)
      gen.newline
    end
    ast.expressions[-1]
  else
    gen.print(ast)
    nil
  end
end
init_free_variables(checker) click to toggle source
# File lib/yadriggy/py/python.rb, line 28
def self.init_free_variables(checker)
  unless checker.references.empty?
    gen = CodeGen.new(Printer.new, checker)
    args = gen.print_free_vars_initializer
    PyCall.exec(gen.printer.output)
    f = PyCall.eval(CodeGen::FreeVarInitName)
    f.call(args)
  end
end
run(&blk) click to toggle source
# File lib/yadriggy/py/python.rb, line 12
def self.run(&blk)
  ast = Yadriggy::reify(blk)
  Syntax.raise_error unless Syntax.check(ast.tree)
  checker = PyTypeChecker.new
  checker.typecheck(ast.tree.body)
  PyCall.exec(Import.source)
  init_free_variables(checker)
  gen = CodeGen.new(Printer.new, checker)
  ast.astrees.each {|t| gen.print(t) unless t == ast }
  last_expr = generate_except_last(ast.tree.body, gen)
  PyCall.exec(gen.printer.output)
  unless last_expr.nil?
    PyCall.eval(CodeGen.new(Printer.new, checker).print(last_expr).printer.output)
  end
end