Вы можете сказать for ... do ... return(something)
, чтобы получить something
из цикла for, который может быть назначен переменной.В этом случае это выглядит так, как это работает:
(%i9) M2: for i thru 10
do (genmatrix (lambda ([i, j], 1 - random(2)), 2, 2),
if determinant(%%) # 0 then return(%%));
[ 1 0 ]
(%o9) [ ]
[ 0 1 ]
(%i10) M2: for i thru 10
do (genmatrix (lambda ([i, j], 1 - random(2)), 2, 2),
if determinant(%%) # 0 then return(%%));
[ 1 0 ]
(%o10) [ ]
[ 1 1 ]
(%i11) M2: for i thru 10
do (genmatrix (lambda ([i, j], 1 - random(2)), 2, 2),
if determinant(%%) # 0 then return(%%));
[ 1 1 ]
(%o11) [ ]
[ 0 1 ]
Обратите внимание, что первый аргумент для genmatrix
является лямбда-выражением (т.е. безымянной функцией).Если вы поместите имя функции массива, например g
, в вашем примере, это не будет иметь ожидаемого эффекта, потому что в Maxima функции массива запоминают функции, предоставляя сохраненный вывод для ввода, который был замечен ранее.Очевидно, что это не предназначено, если выходные данные должны быть случайными.
Обратите также внимание, что M2
будет присвоен done
, если цикл for завершается без нахождения неособой матрицы.Я думаю, что это полезно, поскольку вы можете увидеть, если M2 # 'done
гарантирует, что вы действительно получили результат.
Наконец, обратите внимание, что имеет смысл использовать «группу выражений без локальных переменных» (...)
в качестветело цикла for вместо «группы выражений с локальными переменными» block(...)
, поскольку эффект return
различен в этих двух случаях.