💡 Инструкция: Выберите один ответ из пяти. На работу отведено 70 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 2 из 25
Какую проверку стоит добавить для участка с `ex = :(a + b * c)`?
Julia Julia · Синтаксические деревья Expr Копировать
ex = :(a + b * c)
@show ex.head ex.args dump(ex)
Проверить на отдельном примере, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Проверить на отдельном примере, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Проверить на отдельном примере, что объект `Expr` является отложенным вычисленным значением, поэтому его аргументы уже содержат результаты подвыражений.
Проверить на отдельном примере, что макрос проверяют через `macroexpand`, тесты областей видимости и реальные вызовы с необычными выражениями; один красивый пример не ловит захват имён.
Проверить на отдельном примере, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Вопрос 4 из 25
При переносе кода с `ex = :(a + b * c)` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
e=\operatorname{Expr}(h,a_1,\ldots,a_n)
Приёмка должна подтвердить, что объект `Expr` является отложенным вычисленным значением, поэтому его аргументы уже содержат результаты подвыражений.
Приёмка должна подтвердить, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Приёмка должна подтвердить, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Приёмка должна подтвердить, что макрос проверяют через `macroexpand`, тесты областей видимости и реальные вызовы с необычными выражениями; один красивый пример не ловит захват имён.
Приёмка должна подтвердить, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Вопрос 7 из 25
Какой тест точнее всего зафиксирует границу поведения `ex = quote`?
Julia Julia · Цитирование кода через quote Копировать
name = :value
ex = quote
local tmp = $(Expr(:call, :+, name, 1))
tmp * 2
end
@show ex
Проверить на отдельном примере, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Проверить на отдельном примере, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Проверить на отдельном примере, что макрос проверяют через `macroexpand`, тесты областей видимости и реальные вызовы с необычными выражениями; один красивый пример не ловит захват имён.
Проверить на отдельном примере, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Проверить на отдельном примере, что интерполяция `$` внутри `quote` сначала переводит значение в строку, а затем вставляет эту строку в синтаксическое дерево.
Вопрос 9 из 25
Две реализации участка с `ex = quote` совпадают на обычных данных. Что необходимо проверить перед выпуском?
\$x\mapsto\operatorname{splice}(x)
Приёмка должна подтвердить, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Приёмка должна подтвердить, что интерполяция `$` внутри `quote` сначала переводит значение в строку, а затем вставляет эту строку в синтаксическое дерево.
Приёмка должна подтвердить, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Приёмка должна подтвердить, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Приёмка должна подтвердить, что макрос проверяют через `macroexpand`, тесты областей видимости и реальные вызовы с необычными выражениями; один красивый пример не ловит захват имён.
Вопрос 12 из 25
Какой контрольный тест лучше всего проверит правило, связанное с `local value = $(esc(ex))`?
Julia Julia · Гигиена макросов Копировать
macro timed_value(ex)
quote
local t0 = time_ns()
local value = $(esc(ex))
(value=value, elapsed=time_ns()-t0)
end
end
x = 3
@show @timed_value x^2
Проверить на отдельном примере, что гигиеничный макрос оставляет локальные временные имена локальными и применяет `esc` только к синтаксису вызывающего контекста, который действительно должен там разрешаться.
Проверить на отдельном примере, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Проверить на отдельном примере, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Проверить на отдельном примере, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Проверить на отдельном примере, что для гигиены следует применять `esc` ко всему телу макроса, включая временные локальные имена.
Вопрос 14 из 25
Две реализации участка с `local value = $(esc(ex))` совпадают на обычных данных. Что необходимо проверить перед выпуском?
\operatorname{esc}(e)
Приёмка должна подтвердить, что для гигиены следует применять `esc` ко всему телу макроса, включая временные локальные имена.
Приёмка должна подтвердить, что гигиеничный макрос оставляет локальные временные имена локальными и применяет `esc` только к синтаксису вызывающего контекста, который действительно должен там разрешаться.
Приёмка должна подтвердить, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Приёмка должна подтвердить, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Приёмка должна подтвердить, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Вопрос 17 из 25
Какой тест точнее всего зафиксирует границу поведения `return :(typeof($x))`?
Julia Julia · Время раскрытия Копировать
macro bad_runtime(x)
# x здесь является синтаксисом, а не вычисленным значением.
return :(typeof($x))
end
value = rand()
@show @macroexpand(@bad_runtime value)
Проверить на отдельном примере, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Проверить на отдельном примере, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Проверить на отдельном примере, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Проверить на отдельном примере, что макрос получает обычные значения аргументов после вычисления и потому удобнее функции для численных расчётов времени выполнения.
Проверить на отдельном примере, что гигиеничный макрос оставляет локальные временные имена локальными и применяет `esc` только к синтаксису вызывающего контекста, который действительно должен там разрешаться.
Вопрос 19 из 25
Две реализации участка с `return :(typeof($x))` совпадают на обычных данных. Что необходимо проверить перед выпуском?
\operatorname{macroexpand}(e)
Приёмка должна подтвердить, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Приёмка должна подтвердить, что макрос получает обычные значения аргументов после вычисления и потому удобнее функции для численных расчётов времени выполнения.
Приёмка должна подтвердить, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Приёмка должна подтвердить, что гигиеничный макрос оставляет локальные временные имена локальными и применяет `esc` только к синтаксису вызывающего контекста, который действительно должен там разрешаться.
Приёмка должна подтвердить, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Вопрос 22 из 25
Какую проверку стоит добавить для участка с `@test string(@macroexpand(@twice x)) != ""`?
Julia Julia · Тестовый сценарий Копировать
using Test
macro twice(ex)
return esc(:($ex + $ex))
end
@testset "twice macro" begin
@test @twice(3) == 6
x = 4
@test @twice(x) == 8
@test string(@macroexpand(@twice x)) != ""
end
Проверить на отдельном примере, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Проверить на отдельном примере, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Проверить на отдельном примере, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.
Проверить на отдельном примере, что макрос проверяют через `macroexpand`, тесты областей видимости и реальные вызовы с необычными выражениями; один красивый пример не ловит захват имён.
Проверить на отдельном примере, что успешного macroexpand для одного простого вызова обычно хватает, чтобы исключить захват имён и повторное вычисление во всех выражениях пользователя.
Вопрос 24 из 25
После обновления Julia или пакета поведение участка с `@test string(@macroexpand(@twice x)) != ""` изменилось. Какой критерий приёмки остаётся корректным?
\forall c\in C:\;\operatorname{expand}(c)\text{ корректно}
Приёмка должна подтвердить, что макрос проверяют через `macroexpand`, тесты областей видимости и реальные вызовы с необычными выражениями; один красивый пример не ловит захват имён.
Приёмка должна подтвердить, что успешного macroexpand для одного простого вызова обычно хватает, чтобы исключить захват имён и повторное вычисление во всех выражениях пользователя.
Приёмка должна подтвердить, что `Expr` хранит голову и аргументы синтаксического дерева, а не результат выполнения; анализ формы должен учитывать вложенность и разные эквивалентные записи.
Приёмка должна подтвердить, что `quote... end` создаёт выражение, интерполяция `$` вставляет значение синтаксиса, а `QuoteNode` предотвращает его дальнейшую интерпретацию как кода.
Приёмка должна подтвердить, что макрос раскрывается до выполнения и не видит обычные значения времени запуска, если они не представлены синтаксисом; для работы со значениями чаще нужна функция.