================== generic_base_chain ================== program() type File = record fd: Int end Map#[K, V] = record key: ^K; value: ^V end Cache#[K, V] = record(Map#[Word8, V]) newest: ^K end var store: Cache#[Int, File] byte_key: ^Word8 upcast: ^Map#[Word8, File] proc put#[K2, V2](target: ^Map#[K2, V2]; key: ^K2) begin target^.key := key return begin upcast := @store; put(@store, byte_key) end. --- (source_file (program_declaration (type_section (type_declaration (identifier_definition (identifier)) (record_type (field_declaration (field_identifier (identifier)) (identifier)))) (type_declaration (identifier_definition (identifier) (type_parameters (identifier) (identifier))) (record_type (field_declaration (field_identifier (identifier)) (pointer_type (identifier))) (field_declaration (field_identifier (identifier)) (pointer_type (identifier))))) (type_declaration (identifier_definition (identifier) (type_parameters (identifier) (identifier))) (record_type (generic_type (identifier) (type_arguments (identifier) (identifier))) (field_declaration (field_identifier (identifier)) (pointer_type (identifier)))))) (var_section (variable_declaration (identifier_definition (identifier)) (generic_type (identifier) (type_arguments (identifier) (identifier)))) (variable_declaration (identifier_definition (identifier)) (pointer_type (identifier))) (variable_declaration (identifier_definition (identifier)) (pointer_type (generic_type (identifier) (type_arguments (identifier) (identifier)))))) (procedure_declaration (identifier_definition (identifier) (type_parameters (identifier) (identifier))) (parameter_list (field_declaration (field_identifier (identifier)) (pointer_type (generic_type (identifier) (type_arguments (identifier) (identifier))))) (field_declaration (field_identifier (identifier)) (pointer_type (identifier)))) (procedure_body (block (assignment_statement (field_expression (dereference_expression (identifier)) (identifier)) (identifier))) (return_clause))) (assignment_statement (identifier) (unary_expression (identifier))) (call_expression (identifier) (argument_list (unary_expression (identifier)) (identifier)))))