Dutch-Raptor / mechylang

https://dutch-raptor.github.io/mechylang/mechylang
1 stars 0 forks source link

Using iter::take together with any anonymous function with arguments causes a deadlock within environment #11

Open Dutch-Raptor opened 2 weeks ago

Dutch-Raptor commented 2 weeks ago
Begin eval_program
  Begin Evaluating statement: let nums = (1..).iter().map(fn(x) {
{
        (x * 2);
}
});
    Begin eval_let_statement: let nums = (1..).iter().map(fn(x) {
{
        (x * 2);
}
});
      Begin Evaluating expression: (1..).iter().map(fn(x) {
{
        (x * 2);
}
})
        Begin eval_call_expression((1..).iter().map(fn(x) {
{
        (x * 2);
}
}))
          Begin Evaluating expression: (1..).iter().map
            Begin eval_member_expression: (1..).iter().map
              Begin Evaluating expression: (1..).iter()
                Begin eval_call_expression((1..).iter())
                  Begin Evaluating expression: (1..).iter
                    Begin eval_member_expression: (1..).iter
                      Begin Evaluating expression: (1..)
                        Begin eval_range_expression: (1..)
                          Begin Evaluating expression: 1
                          End Evaluating expression: 1
                        End eval_range_expression: (1..)
                      End Evaluating expression: (1..)
                    End eval_member_expression: (1..).iter
                  End Evaluating expression: (1..).iter
                End eval_call_expression((1..).iter())
              End Evaluating expression: (1..).iter()
            End eval_member_expression: (1..).iter().map
          End Evaluating expression: (1..).iter().map
          Begin Evaluating expression: fn(x) {
{
        (x * 2);
}
}
          End Evaluating expression: fn(x) {
{
        (x * 2);
}
}
          Begin new_enclosed
          End new_enclosed
          Begin Environment::drop
          End Environment::drop
        End eval_call_expression((1..).iter().map(fn(x) {
{
        (x * 2);
}
}))
      End Evaluating expression: (1..).iter().map(fn(x) {
{
        (x * 2);
}
})
      Begin Environment::set nums
        Begin InnerEnvironment::set nums
        End InnerEnvironment::set nums
      End Environment::set nums
    End eval_let_statement: let nums = (1..).iter().map(fn(x) {
{
        (x * 2);
}
});
  End Evaluating statement: let nums = (1..).iter().map(fn(x) {
{
        (x * 2);
}
});
  Begin Evaluating statement: let sum = 0;
    Begin eval_let_statement: let sum = 0;
      Begin Evaluating expression: 0
      End Evaluating expression: 0
      Begin Environment::set sum
        Begin InnerEnvironment::set sum
        End InnerEnvironment::set sum
      End Environment::set sum
    End eval_let_statement: let sum = 0;
  End Evaluating statement: let sum = 0;
  Begin Evaluating statement: nums.take(3).for_each(fn(x) {
{
        (sum = (sum + x));
}
});
    Begin Evaluating expression: nums.take(3).for_each(fn(x) {
{
        (sum = (sum + x));
}
})
      Begin eval_call_expression(nums.take(3).for_each(fn(x) {
{
        (sum = (sum + x));
}
}))
        Begin Evaluating expression: nums.take(3).for_each
          Begin eval_member_expression: nums.take(3).for_each
            Begin Evaluating expression: nums.take(3)
              Begin eval_call_expression(nums.take(3))
                Begin Evaluating expression: nums.take
                  Begin eval_member_expression: nums.take
                    Begin Evaluating expression: nums
                      Begin eval_identifier(nums)
                        Begin Environment::get nums
                          Begin InnerEnvironment::get nums
                          End InnerEnvironment::get nums
                        End Environment::get nums
                      End eval_identifier(nums)
                    End Evaluating expression: nums
                    Begin Environment::drop
                    End Environment::drop
                  End eval_member_expression: nums.take
                End Evaluating expression: nums.take
                Begin Evaluating expression: 3
                End Evaluating expression: 3
                Begin Environment::mutate nums
                  Begin InnerEnvironment::mutate nums
                    Begin apply_function(fn(x) {
{
        (x * 2);
}
}, [Argument { span: Some(Span { bytes: 41..56, file: None }), value: Integer(1) }])
                      Begin extend_function_env(fn(x) {
{
        (x * 2);
}
}, [Integer(1)])
                        Begin new_enclosed
                        End new_enclosed
                        Begin Environment::set x

Deadlocked now from begin::mutate nums and Begin Environment::set x

Dutch-Raptor commented 2 weeks ago

Source that causes the deadlock:

            let nums = (1..).iter().map(fn(x) { x * 2 });
            let sum = 0;
            nums.take(3).for_each(fn(x) {
                sum = sum + x;
            });
            assert_eq(sum, 6);