Question

Comment puis-je passer une variable par référence dans un schéma ?

Un exemple de la fonctionnalité que je souhaite :

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

(define y 2)

(foo y)

(display y) ;outputs: 5

Existe-t-il également un moyen de revenir par référence ?

Autres conseils

Comme l'a dit Jari, vous souhaitez généralement éviter de passer par référence dans Scheme, car cela suggère que vous abusez des effets secondaires.

Si vous le souhaitez, vous pouvez cependant inclure tout ce que vous souhaitez transmettre par référence dans un cons boîte.

(cons 5 (void))

produira une boîte contenant 5.Si vous passez cette case à une procédure qui change le 5 en 6, votre case d'origine contiendra également un 6.Bien sûr, il ne faut pas oublier cons et car le cas échéant.

Chez Scheme (et éventuellement d'autres implémentations) a une procédure appelée box (et ses compagnons box? et unbox) spécifiquement pour cette absurdité de boxe/unboxing : http://www.scheme.com/csug8/objects.html#./objects:s43

Vous pouvez utiliser une macro:

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

lambda!

(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 a raison, il est un peu chic à utiliser par référence, au moins avec des variables.Cependant, le comportement que vous souhaitez est utilisé et souvent encouragé, tout le temps d'une manière plus schémise en utilisant des fermetures. pages 181 et182 (Google Books) dans le schéma chevonnait fait un meilleur travail puis je peux l'expliquer.

Voici une référence qui donne une macro qui vous permet d'utiliser une syntaxe C comme celle de "Pass par référence".Olegs Site est une mine d'or pour des lectures intéressantes alors assurez-vous de réserver la marque si vous ne l'avez pas déjà.

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

Vous pouvez affecter un contexte extérieur à partir d'une fonction définie dans ce contexte extérieur, ce qui vous donne l'affect de la passe par les variables de référence, c'est-à-dire des effets secondaires.

(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

Cette solution limite la portée des effets secondaires.

sinon il y a (définir x (case 5)), (UNBOX X), etc. Comme mentionné dans un sous-mandal de l'ELI, qui est identique à la solution des inconvénients suggérée par ERJIANG.

Vous avez probablement trop d'utilité de C, PHP ou autre chose. Dans le schéma, vous ne voulez pas faire de choses comme Pass-by- *. Comprenez d'abord à quel point la portée signifie et comment la différence de mise en œuvre se comporter (en particulier pour déterminer quelle est la différence entre Lisp et Scheme).

Par essence, un langage de programmation purement fonctionnel n'a pas d'effet secondaire.Par conséquent, cela signifie que PASS-BY-REF n'est pas un concept fonctionnel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top