LINUX.ORG.RU

По ссылке или по значению?

 ,


0

1

Была уже похожая тема, но я до конца так и не понял, поэтому решил возвратится. Я не понимаю, как передаются параметры в функцию.


(define a 1)
(define tst (lambda(x) (write (eq? x a))))
(tst a); #t
получается, вроде, по ссылке. По значению было бы так:

Передача параметров по значению. Формальному параметру присваивается значение фактического параметра. В этом случае формальный параметр будет содержать копию значения

https://ru.wikipedia.org/wiki/Подпрограмма

У нас же, оба символа указывают на ту же область. НО:

(define tst2 (lambda(x) (set! x 'new_value) (write (eq? x a))))
(tst2 a); #f
Ведет себя это так, как будто по значению

и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических.

Получается, мы передаем по ссылке, но когда изменяем, создается новое значение. Причем, это работает только с set! но не с vector-set! set-car! и пр.

В итоге, мы, вроде, имеем то, что все передается по ссылке, но с set! у нас процедуры ведут себя так, как будто передаем по значению. Я пока на этом остановился.

Нахрена они все так запутали? Они память экономят, или что?

Всегда по значению. Когда передается список или вектор, передается значение ссылки на список или вектор.

Puzan ★★★★ ()
Ответ на: комментарий от Puzan

Если бы было

Всегда по значению

Соблюдалось бы

и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических.

anonimous ()
Ответ на: комментарий от Puzan

Всегда по значению.

И, кроме того:

В этом случае формальный параметр будет содержать копию значения

У нас формальный параметр содержит не копию

anonimous ()

Господи...

Параметры функций передаются в Scheme по значению их привязок.

Этим объясняются видимые тобой якобы аномалии.

Когда вызывается функция, создаются новые привязки, которые связывают формальные аргументы функции с теми значениями, которые были вычислены для аргументов.

set! изменяет сами привязки переменных, тогда как vector-set!, set-car! и прочие someshit-set! изменяют объекты, связанный с переменными.

ilammy ★★★ ()
Ответ на: комментарий от anonimous

и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических.

Так это так и есть. (tst a) никаким образом не может изменить a, если tst — функция.

monk ★★★★★ ()
Ответ на: комментарий от monk

Так это так и есть

Да, но если бы была «настоящая» передача по значению, было бы копирование, а его там нет. Это во время самой операции set! просто происходит связывание параметра с новым значением. Своего рода имитация.

anonimous ()
Ответ на: комментарий от anonimous

Да, но если бы была «настоящая» передача по значению, было бы копирование, а его там нет

Копирование значения есть. Также как и в Си. eq? как раз и сравнивает значения в переменных.

monk ★★★★★ ()
Ответ на: комментарий от monk

eq? как раз и сравнивает значения в переменных.

Он выясняет, указывают ли две переменные на одно и то же значение, или на разные.

anonymous ()

Ты бы лучше спросил, как в таком «простом» языке как Схема оказалось 4 варианта проверки на равенство.

anonymous ()
Ответ на: комментарий от anonymous

4 варианта проверки на равенство.

А что, какой-то вариант лишний?

anonymous ()
Ответ на: комментарий от anonymous

Ты бы лучше спросил, как в таком «простом» языке как Схема оказалось 4 варианта проверки на равенство.

eq?, eqv?, equal? а какой четвертый?

korvin_ ★★★★★ ()
Ответ на: комментарий от elyadow

Тогда их вообще 10: eq?, eqv?, equal?, =, boolean=?, symbol=?, char=?, char-ci=?, string=?, string-ci=?.

ilammy ★★★ ()

Пытаться что-то объяснить ТСу это такой изощренный вид мазохизма.

Поциент:

  • не написал ни одной строки рабочего кода
  • не прочитал ни одной предложенной книги или статьи
  • выдумывает собственные альтернативные определения терминов
  • учит языки по corner cases, найденным на говноресурсах типа хабра или лора
  • физически не способен детально углубиться в какую-либо тему
  • перечисленные пункты считает признаками собственной гениальности
anonymous ()
Ответ на: комментарий от anonymous

Пытаться что-то объяснить ТСу это такой изощренный вид мазохизма.

You do not really understand something unless you can explain it to your grandmother.

Или в русском варианте «Если ты не можешь объяснить свою теорию 8-летнему ребенку - значит ты сам не понимаешь о чем говоришь, и грош цена такой теории.».

Так вот, в качестве grandmother/8-летнего ребёнка из цитаты ТС очень даже годится.

monk ★★★★★ ()
Ответ на: комментарий от ilammy

В R5RS boolean=?, symbol=? нету.

Вообще =, char-ci=?, string-ci=? сравнивают не так как equal?. А вот зачем char=? string=? — загадка.

Впрочем как и zero?, positive?, negative?, force, delay — вроде как однострочники, зачем они в стандарте...?

monk ★★★★★ ()
Ответ на: комментарий от elyadow

R5RS даже equal? не такой как в Scheme

В смысле? А Scheme — это тогда что? R6RS? R4RS?

korvin_ ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.