← Архив: Common Lisp

Передача переменных по ссылке

Author: · 01.02.2013 00:25
· original author: gmihalkov
Я слабо знаю этот язык, так что сильно не бейте.В C++ была такая возможность:
void f (int *v)
{
v = 5;
}
int a = 1;
f (&a);
После этого a становилось равно 5.
Есть ли в CLisp возможность передать переменную в функцию по ссылке?
Или, к примеру, связать две переменные (так, чтобы изменение содержимого одной изменяло содержимое первой)?
· original author: klimenko.serj
подобный вопрос уже поднимался на форуме:
http://lisper.ru/forum/thread/630
P.S. "CLisp" - конкретная реализация, язык - "Common Lisp" или "CL". )
· original author: archimag
> подобный вопрос уже поднимался на форуме:
> http://lisper.ru/forum/thread/630

Только в обсуждении там какая-то ерунда, а между тем, функцию foo можно было написать как-нибудь так:
(defun foo (l)
  (rplaca l (cadr l))
  (rplacd l (cddr l))
)

И всё бы прекрасно работало.
· original author: archimag
> Есть ли в CLisp возможность передать переменную в функцию по ссылке?
В Common Lisp используется http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing. Фактически, во многих случаях так и происходит (передача по ссылке).
P.S. Код на C++ вам точно больше показывать не стоит, вы всё перепутали.
· original author: den73
У меня в библиотеке есть, понадобилось, когда переносил код с другого языка. Реализуется как обёртка и набор макросов.
[code=common lisp]
>(defun ПринятьПоСсылке (параметр)
      (with-byref-params (параметр)
         (setf параметр 5)))
ПринятьПоСсылке
> (let ((x 4)) (ПринятьПоСсылке (byref x)) x)
5
[/code]
· original author: den73
У меня в библиотеке есть, понадобилось, когда переносил код с другого языка. Реализуется как обёртка и набор макросов.
>(defun ПринятьПоСсылке (параметр)
      (with-byref-params (параметр)
         (setf параметр 5)
)
)

ПринятьПоСсылке
> (let ((x 4)) (ПринятьПоСсылке (byref x)) x)
5
· original author: den73
библиотека здесь http://code.google.com/p/def-symbol-readmacro/
файл называется http://code.google.com/p/def-symbol-readmacro/source/browse/pass-by-ref.lisp
Правда, загрузка библиотеки пока может вызвать затруднения, но мы над этим работаем и, наверное, вопрос решится в течение месяца.