Разница между вызовом по имени и вызовом по текстовому механизму передачи параметров с примерами

Из 5 типов механизма передачи параметров: 1. передача по значению 2. передача по ссылке 3. передача по значению-результату 4. передача по тексту (макросы на C) 5. передача по- имя (что-то вроде продолжений)

Мне просто нужна разница между двумя последними. Пожалуйста, помогите !!

Ссылка: http://www.math.grin.edu/~rebelsky/Courses/CS302/99S/Outlines/outline.36.html


person Deepaank    schedule 26.07.2015    source источник
comment
Вы должны добавить больше контекста. В отличие от вас, никто из нас не посещал этот курс. Честно говоря, это кажется просто неправильной терминологией, которую придумал ленивый лектор. Если предположить, что речь идет о C, то на самом деле в языке есть только 1 и 2, а 3 — это не механизм, а шаблон проектирования, 4 — не передача параметров, а 5 — нечто совершенно другое.   -  person Marcus Müller    schedule 26.07.2015
comment
Я сам не посещал этот класс. Я зашел по этой ссылке, когда искал ответ на свой вопрос. Хотя последние два вообще не используются в текущей реализации передачи параметров на любом языке, я просто хочу прояснить разницу, теоретически или на каком-то примере типа псевдокода.   -  person Deepaank    schedule 26.07.2015


Ответы (1)


Вызов по тексту — это когда аргументы функции не оцениваются до того, как они будут переданы, а затем заменяются экземплярами параметров. Аргументы передаются «как текст» и, следовательно, могут вызвать проблемы, если локальная граница функции использует те же имена переменных за пределами области видимости.

int i = 0;

void f(int j) {
    print(j);   // is replaced with print(i + 5) and prints 5
    int i = 20;
    print(j);   // is replaced with print(i + 5) and prints 25
}

f(i + 5);        // passes the unevaluated expression i + 5

Вызов по имени похож на то, что аргументы функции не оцениваются до того, как они будут переданы, а затем заменяются экземплярами параметров. Однако параметры привязаны к переходникам, которые действуют как замыкание для переменных в области действия вызывающей функции.

void f(int j) {
    print(j);   // prints 5
    print(j);   // prints 10
}

int i = 0;
f(i + 5);        // passes the unevaluated expression i + 5

Дополнительную информацию можно найти здесь: http://www.cs.sjsu.edu/~pearce/modules/projects/Jedi/params/index.htm

person Andrew Deniszczyc    schedule 23.05.2017