Как я понимаю, при вызове функций схема использует значение pass-by-value. Одна из реализаций очереди я видел определяется следующим образом (yet another scheme tutorial):Передача по значению и очередь
(define (make-queue)
(cons '() '()))
(define (enqueue! queue obj)
(let ((lobj (cons obj '())))
(if (null? (car queue))
(begin
(set-car! queue lobj)
(set-cdr! queue lobj))
(begin
(set-cdr! (cdr queue) lobj)
(set-cdr! queue lobj)))
(car queue)))
затем создает очередь, как передает его enqueue!
:
(define q (make-queue))
;Value: q
(enqueue! q 'a)
;Value 12: (a)
Как переменная очередь передается функции может быть изменен, если только передается по значению? Я читал, что использование set-box и unbox может сделать трюк, но это не так.
Из того, что я понимаю, переменная очереди - это пара (часть автомобиля указывает на голову очереди и часть cdr, указывающую на конец очереди). Поэтому я не вижу, как установленный автомобиль! копии этой переменной могут изменить часть автомобиля самого исходного объекта (переменная очереди).
Может кто-нибудь объяснить мне, как это работает? Является ли переменная очереди завернутой как адрес в пару?
спасибо за объяснение и особенно зачем устанавливать! не влияет на другую привязку. Теперь гораздо яснее – philibertin
Java также передается по значению. Это очень похоже на схему. – Sylwester
@ Sylwester Да, это то, что я сказал в своем ответе. Большинство языков проходят по значению. Я не знаю, язык по умолчанию, хотя некоторые языки поддерживают его (на ум приходят C++ и PHP). –