forall T . T:ABIEncode => function log(val : T) {
let CONSOLE_ADDRESS : word = 0x000000000000000000636F6e736F6c652e6c6f67;
let payload = abi_encode(val);
// извлекаем внутреннее представление payload как word
let ptr = Typedef.rep(payload);
assembly {
pop(
staticcall(
gas(),
CONSOLE_ADDRESS,
add(ptr, 32),
mload(ptr),
0,
0
)
)
}
}Подобно Rust и Lean, все вызовы классов типов и обобщённых функций полностью мономорфизируются (monomorphized) на этапе компиляции. Это означает, что полиморфные функции не несут накладных расходов во время выполнения по сравнению с полностью конкретизированными функциями. Хотя это действительно приводит к тому, что скомпилированный код для EVM может содержать несколько специализированных версий одной и той же обобщённой функции, это не увеличивает размер бинарного файла по сравнению с классическим Solidity, где для получения эквивалентной функциональности в любом случае потребовалось бы определять несколько отдельных функций. Мы считаем такой компромисс полностью оправданным для нашей предметной области.
#core