Вопрос

Как передать переменную по ссылке в схеме?

Пример функциональности, которую я хочу:

(define foo
  (lambda (&x)
    (set! x 5)))

(define y 2)

(foo y)

(display y) ;outputs: 5

Кроме того, есть ли способ вернуться по ссылке?

Другие советы

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

Однако если вы хотите, вы можете заключить все, что хотите передать по ссылке, в cons коробка.

(cons 5 (void))

создаст коробку, содержащую 5.Если вы передадите это поле процедуре, которая заменяет 5 на 6, исходное поле также будет содержать 6.Конечно, нужно помнить cons и car когда это уместно.

В Chez Scheme (и, возможно, в других реализациях) есть процедура под названием box (и его спутники box? и unbox) специально для этой чепухи с боксом/распаковкой: http://www.scheme.com/csug8/objects.html#./objects:s43

Вы можете использовать макрос:

scheme@(guile-user)> (define-macro (foo var)`(set! ,var 5))
scheme@(guile-user)> (define y 2)
scheme@(guile-user)> (foo y)
scheme@(guile-user)> (display y)(newline)
5
.

лямбда!

(define (foo getx setx)
  (setx (+ (getx) 5)))

(define y 2)
(display y)(newline)

(foo
 (lambda () y)
 (lambda (val) (set! y val)))

(display y)(newline)
.

jari правильно, это несколько некорректно, чтобы пройти через ссылку, по крайней мере, с переменными.Однако поведение, которое вы хотите использовать, и часто поощряется, все время в большей схеме, как путь, используя замыкание. Страницы 181 и182 (Google Books) в приправленной схеме делают лучшую работу, то я могу объяснить его.

Вот ссылка, которая дает макрос, который позволяет вам использовать синтаксис типа C, для ссылки.Site Olegs - это золотая шахта для интересных читаний, поэтому убедитесь, что забронировать, отметьте его, если у вас еще нет.

http://okmij.org/ftp/scheme/pointer-as-Closion.txt

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

(define (outer-function)
  (define referenced-var 0)
  (define (fun-affects-outer-context) (set! referenced-var 12) (void))
  ;...
  (fun-affects-outer-context)
  (display referenced-var)
)
(outer-function) ; displays 12
.

Это решение ограничивает объем побочных эффектов.

В противном случае есть (определяют x (box 5)), (Unbox x) и т. Д., Как упоминалось в подменении ELI, что такое же, как и в минусе, предложенном Erjiang.

Вы, вероятно, используете слишком много C, PHP или что-то еще. В схеме вы не хотите делать вещи, как Pass-*. Сначала понимаю, какую область имею в виду возможности и как разная реализация ведет себя (в частности, пытается выяснить, какая разница между Lisp и схемой).

Сутью чисто функциональный язык программирования не имеет побочного эффекта.Следовательно, это означает, что Pass-By-Ref не является функциональной концепцией.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top