// File: pfnet-research[P]pml/src/parser.cpp
// Function: parser::letfun_expr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned long&)
expr_result_t letfun_expr(std::string const& input, size_t& pos) {
    EXPECT(letfun_token, LetFun);
    EXPECT(ident_token, Ident);
    auto name = ident_token.lexime;
    auto depty_result = dependent_type(input, pos);
    if (depty_result.is_error())
        return depty_result.convert<ptr<ast::expr_t>>();
    auto type = depty_result.ok();

    EXPECT(eq_token, Eq);

    auto init_result = expr(input, pos);
    if (init_result.is_error())
        return init_result;
    auto init = init_result.ok();

    EXPECT(in_token, In);

    auto body_result = expr(input, pos);
    if (body_result.is_error())
        return body_result;
    auto body = body_result.ok();

    return expr_result_t::ok(make<ast::letfun_expr_t>(name, type, init, body));
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x420, %rsp            # imm = 0x420
movq %rdi, -0x360(%rbp)
movq %rdi, %rax
movq %rax, -0x358(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
leaq -0x50(%rbp), %rdi
movq %rdi, -0x350(%rbp)
movl $0x1, %ecx
callq 0x364d0
movq -0x350(%rbp), %rdi
callq 0x40510
movb %al, -0x341(%rbp)
jmp 0x3c0cc
movb -0x341(%rbp), %al
testb $0x1, %al
jne 0x3c0d8
jmp 0x3c11c
leaq -0x50(%rbp), %rdi
callq 0x405b0
movq %rax, -0x368(%rbp)
jmp 0x3c0ea
movq -0x368(%rbp), %rsi
movq -0x360(%rbp), %rdi
callq 0x418f0
jmp 0x3c0ff
movl $0x1, -0x60(%rbp)
jmp 0x3c85b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c874
leaq -0x50(%rbp), %rdi
callq 0x40630
movq %rax, -0x370(%rbp)
jmp 0x3c12e
movq -0x370(%rbp), %rsi
leaq -0x90(%rbp), %rdi
callq 0x406b0
jmp 0x3c143
movq -0x88(%rbp), %rax
movq %rax, -0x378(%rbp)
leaq -0x80(%rbp), %rdi
callq 0xa280
movq -0x378(%rbp), %rcx
addq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
leaq -0xc8(%rbp), %rdi
movl $0xa, %ecx
callq 0x364d0
jmp 0x3c189
leaq -0xc8(%rbp), %rdi
callq 0x40510
movb %al, -0x379(%rbp)
jmp 0x3c19d
movb -0x379(%rbp), %al
testb $0x1, %al
jne 0x3c1a9
jmp 0x3c201
leaq -0xc8(%rbp), %rdi
callq 0x405b0
movq %rax, -0x388(%rbp)
jmp 0x3c1be
movq -0x388(%rbp), %rsi
movq -0x360(%rbp), %rdi
callq 0x418f0
jmp 0x3c1d3
movl $0x1, -0x60(%rbp)
jmp 0x3c827
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c84d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c841
leaq -0xc8(%rbp), %rdi
callq 0x40630
movq %rax, -0x390(%rbp)
jmp 0x3c216
movq -0x390(%rbp), %rsi
leaq -0xf8(%rbp), %rdi
callq 0x406b0
jmp 0x3c22b
movq -0xf0(%rbp), %rax
movq %rax, -0x3a0(%rbp)
leaq -0xe8(%rbp), %rdi
movq %rdi, -0x398(%rbp)
callq 0xa280
movq -0x3a0(%rbp), %rcx
movq -0x398(%rbp), %rsi
addq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
leaq -0x118(%rbp), %rdi
callq 0xa190
jmp 0x3c272
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq -0x170(%rbp), %rdi
callq 0x3af10
jmp 0x3c288
leaq -0x170(%rbp), %rdi
callq 0x41b10
movb %al, -0x3a1(%rbp)
jmp 0x3c29c
movb -0x3a1(%rbp), %al
testb $0x1, %al
jne 0x3c2a8
jmp 0x3c2fc
movq -0x360(%rbp), %rdi
leaq -0x170(%rbp), %rsi
callq 0x41b30
jmp 0x3c2bd
movl $0x1, -0x60(%rbp)
jmp 0x3c7db
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c819
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c80d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c801
leaq -0x170(%rbp), %rdi
callq 0x41b70
movq %rax, -0x3b0(%rbp)
jmp 0x3c311
movq -0x3b0(%rbp), %rsi
leaq -0x1c0(%rbp), %rdi
callq 0x15870
jmp 0x3c326
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
leaq -0x1f8(%rbp), %rdi
movl $0xd, %ecx
callq 0x364d0
jmp 0x3c344
leaq -0x1f8(%rbp), %rdi
callq 0x40510
movb %al, -0x3b1(%rbp)
jmp 0x3c358
movb -0x3b1(%rbp), %al
testb $0x1, %al
jne 0x3c364
jmp 0x3c3bc
leaq -0x1f8(%rbp), %rdi
callq 0x405b0
movq %rax, -0x3c0(%rbp)
jmp 0x3c379
movq -0x3c0(%rbp), %rsi
movq -0x360(%rbp), %rdi
callq 0x418f0
jmp 0x3c38e
movl $0x1, -0x60(%rbp)
jmp 0x3c7a7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c7cd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c7c1
leaq -0x1f8(%rbp), %rdi
callq 0x40630
movq %rax, -0x3c8(%rbp)
jmp 0x3c3d1
movq -0x3c8(%rbp), %rsi
leaq -0x228(%rbp), %rdi
callq 0x406b0
jmp 0x3c3e6
movq -0x220(%rbp), %rax
movq %rax, -0x3d0(%rbp)
leaq -0x218(%rbp), %rdi
callq 0xa280
movq -0x3d0(%rbp), %rcx
addq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq -0x260(%rbp), %rdi
callq 0x3bf30
jmp 0x3c427
leaq -0x260(%rbp), %rdi
callq 0x41970
movb %al, -0x3d1(%rbp)
jmp 0x3c43b
movb -0x3d1(%rbp), %al
testb $0x1, %al
jne 0x3c447
jmp 0x3c48a
movq -0x360(%rbp), %rdi
leaq -0x260(%rbp), %rsi
callq 0x41990
jmp 0x3c45c
movl $0x1, -0x60(%rbp)
jmp 0x3c773
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c799
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c78d
leaq -0x260(%rbp), %rdi
callq 0x419e0
movq %rax, -0x3e0(%rbp)
jmp 0x3c49f
movq -0x3e0(%rbp), %rsi
leaq -0x270(%rbp), %rdi
callq 0x13050
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
leaq -0x2a8(%rbp), %rdi
movl $0x2, %ecx
callq 0x364d0
jmp 0x3c4d0
leaq -0x2a8(%rbp), %rdi
callq 0x40510
movb %al, -0x3e1(%rbp)
jmp 0x3c4e4
movb -0x3e1(%rbp), %al
testb $0x1, %al
jne 0x3c4f0
jmp 0x3c548
leaq -0x2a8(%rbp), %rdi
callq 0x405b0
movq %rax, -0x3f0(%rbp)
jmp 0x3c505
movq -0x3f0(%rbp), %rsi
movq -0x360(%rbp), %rdi
callq 0x418f0
jmp 0x3c51a
movl $0x1, -0x60(%rbp)
jmp 0x3c73f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c765
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c759
leaq -0x2a8(%rbp), %rdi
callq 0x40630
movq %rax, -0x3f8(%rbp)
jmp 0x3c55d
movq -0x3f8(%rbp), %rsi
leaq -0x2d8(%rbp), %rdi
callq 0x406b0
jmp 0x3c572
movq -0x2d0(%rbp), %rax
movq %rax, -0x400(%rbp)
leaq -0x2c8(%rbp), %rdi
callq 0xa280
movq -0x400(%rbp), %rcx
addq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq -0x310(%rbp), %rdi
callq 0x3bf30
jmp 0x3c5b3
leaq -0x310(%rbp), %rdi
callq 0x41970
movb %al, -0x401(%rbp)
jmp 0x3c5c7
movb -0x401(%rbp), %al
testb $0x1, %al
jne 0x3c5d3
jmp 0x3c616
movq -0x360(%rbp), %rdi
leaq -0x310(%rbp), %rsi
callq 0x41990
jmp 0x3c5e8
movl $0x1, -0x60(%rbp)
jmp 0x3c70b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c731
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c725
leaq -0x310(%rbp), %rdi
callq 0x419e0
movq %rax, -0x410(%rbp)
jmp 0x3c62b
movq -0x410(%rbp), %rsi
leaq -0x320(%rbp), %rdi
movq %rdi, -0x418(%rbp)
callq 0x13050
movq -0x418(%rbp), %r8
leaq -0x340(%rbp), %rdi
leaq -0x118(%rbp), %rsi
leaq -0x1c0(%rbp), %rdx
leaq -0x270(%rbp), %rcx
callq 0x3c890
jmp 0x3c66f
leaq -0x330(%rbp), %rdi
movq %rdi, -0x420(%rbp)
leaq -0x340(%rbp), %rsi
callq 0x41bf0
movq -0x360(%rbp), %rdi
movq -0x420(%rbp), %rsi
callq 0x41a60
jmp 0x3c69e
leaq -0x330(%rbp), %rdi
callq 0x13080
leaq -0x340(%rbp), %rdi
callq 0x41c20
movl $0x1, -0x60(%rbp)
leaq -0x320(%rbp), %rdi
callq 0x13080
jmp 0x3c70b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0x3c6fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
leaq -0x330(%rbp), %rdi
callq 0x13080
leaq -0x340(%rbp), %rdi
callq 0x41c20
leaq -0x320(%rbp), %rdi
callq 0x13080
jmp 0x3c725
leaq -0x310(%rbp), %rdi
callq 0x2ffa0
leaq -0x2d8(%rbp), %rdi
callq 0x404f0
jmp 0x3c73f
leaq -0x310(%rbp), %rdi
callq 0x2ffa0
leaq -0x2d8(%rbp), %rdi
callq 0x404f0
jmp 0x3c759
leaq -0x2a8(%rbp), %rdi
callq 0x407c0
leaq -0x270(%rbp), %rdi
callq 0x13080
jmp 0x3c773
leaq -0x2a8(%rbp), %rdi
callq 0x407c0
leaq -0x270(%rbp), %rdi
callq 0x13080
jmp 0x3c78d
leaq -0x260(%rbp), %rdi
callq 0x2ffa0
leaq -0x228(%rbp), %rdi
callq 0x404f0
jmp 0x3c7a7
leaq -0x260(%rbp), %rdi
callq 0x2ffa0
leaq -0x228(%rbp), %rdi
callq 0x404f0
jmp 0x3c7c1
leaq -0x1f8(%rbp), %rdi
callq 0x407c0
leaq -0x1c0(%rbp), %rdi
callq 0x17e50
jmp 0x3c7db
leaq -0x1f8(%rbp), %rdi
callq 0x407c0
leaq -0x1c0(%rbp), %rdi
callq 0x17e50
jmp 0x3c801
leaq -0x170(%rbp), %rdi
callq 0x41c40
leaq -0x118(%rbp), %rdi
callq 0xa240
leaq -0xf8(%rbp), %rdi
callq 0x404f0
jmp 0x3c827
leaq -0x170(%rbp), %rdi
callq 0x41c40
leaq -0x118(%rbp), %rdi
callq 0xa240
leaq -0xf8(%rbp), %rdi
callq 0x404f0
jmp 0x3c841
leaq -0xc8(%rbp), %rdi
callq 0x407c0
leaq -0x90(%rbp), %rdi
callq 0x404f0
jmp 0x3c85b
leaq -0xc8(%rbp), %rdi
callq 0x407c0
leaq -0x90(%rbp), %rdi
callq 0x404f0
jmp 0x3c874
leaq -0x50(%rbp), %rdi
callq 0x407c0
movq -0x358(%rbp), %rax
addq $0x420, %rsp            # imm = 0x420
popq %rbp
retq
leaq -0x50(%rbp), %rdi
callq 0x407c0
movq -0x58(%rbp), %rdi
callq 0xa650
nopw %cs:(%rax,%rax)