Почему return / redo оценивает функции результата в контексте вызова, но результаты блока не оцениваются?

Прошлой ночью я узнал о параметре / redo, когда выreturn из функции. Это позволяет вам вернутьсядругой функция, которая затем вызывается на вызывающем сайте и повторно вызывает оценщика из той же позиции

>> foo: func [a] [(print a) (return/redo (func [b] [print b + 10]))] 

>> foo "Hello" 10
Hello
20

Даже еслиfoo это функция, которая принимает только один аргумент, это сейчасдействует как функция, которая приняла два аргумента, Что-то подобное в противном случае потребовало бы, чтобы вызывающий абонент знал, что вы возвращаете функцию, и этот вызывающий должен будет вручную использоватьdo оценщик на нем.

Таким образом, безreturn/redo, вы'получил:

>> foo: func [a] [(print a) (return (func [b] [print b + 10]))] 

>> foo "Hello" 10
Hello
== 10

foo потреблял свой единственный параметр и возвращал функцию по значению (которое не было вызвано, поэтому интерпретатор перешел). Тогда выражение оценивается до 10. Еслиreturn/redo ты не существоваля должен был написать:

>> do foo "Hello" 10
Hello
20

Это удерживает абонента от необходимости знать (или заботиться), если выМы решили вернуть функцию для выполнения. И это здорово, потому что вы можете делать такие вещи, как оптимизация хвостового вызова или писать оболочку для самой функции возврата. Вот'S вариантreturn это печатает сообщение, но все еще выходит из функции и предоставляет результат:

>> myreturn: func [] [(print "Leaving...") (return/redo :return)]

>> foo: func [num] [myreturn num + 10]

>> foo 10
Leaving...
== 20

Но функции нет единственное, что имеет поведение вdo, Так что, если это общий шаблон для "устранение необходимости делать DO на месте вызоватогда почемуЭто что-нибудь печатает?

>> test: func [] [return/redo [print "test"]]

>> test 
== [print "test"]

Он только что возвратил блок по значению, как при обычном возврате. не должен»т распечатали "тестовое задание"? Тот'с чемdo будет ... эээ, делать с этим

>> do [print "test"]
test

Ответы на вопрос(2)

Ваш ответ на вопрос