================== generic_inference ================== program() type File = record fd: Int end Cell#[T] = record held: ^T end var files: Cell#[File] bytes: Cell#[Word8] f: File b: Word8 proc store#[T](target: ^Cell#[T]; value: ^T) target^.held := value return proc relay#[T](target: ^Cell#[T]; value: ^T) store(target, value) return begin store(@files, @f); relay(@bytes, @b); store(@files, nil) end. --- (source_file (program_declaration (type_section (type_declaration (identifier_definition (identifier)) (record_type (field_declaration (identifier_definition (identifier)) (identifier)))) (type_declaration (identifier_definition (identifier)) (type_parameters (identifier)) (record_type (field_declaration (identifier_definition (identifier)) (pointer_type (identifier)))))) (var_section (variable_declaration (identifier_definition (identifier)) (generic_type (identifier) (type_arguments (identifier)))) (variable_declaration (identifier_definition (identifier)) (generic_type (identifier) (type_arguments (identifier)))) (variable_declaration (identifier_definition (identifier)) (identifier)) (variable_declaration (identifier_definition (identifier)) (identifier))) (procedure_declaration (identifier_definition (identifier)) (type_parameters (identifier)) (parameter_list (field_declaration (identifier_definition (identifier)) (pointer_type (generic_type (identifier) (type_arguments (identifier))))) (field_declaration (identifier_definition (identifier)) (pointer_type (identifier)))) (procedure_body (block (assignment_statement (field_expression (dereference_expression (identifier)) (identifier)) (identifier))) (return_clause))) (procedure_declaration (identifier_definition (identifier)) (type_parameters (identifier)) (parameter_list (field_declaration (identifier_definition (identifier)) (pointer_type (generic_type (identifier) (type_arguments (identifier))))) (field_declaration (identifier_definition (identifier)) (pointer_type (identifier)))) (procedure_body (block (call_expression (identifier) (argument_list (identifier) (identifier)))) (return_clause))) (call_expression (identifier) (argument_list (unary_expression (identifier)) (unary_expression (identifier)))) (call_expression (identifier) (argument_list (unary_expression (identifier)) (unary_expression (identifier)))) (call_expression (identifier) (argument_list (unary_expression (identifier)) (literal (nil))))))