Domanda

Come posso passare una variabile per riferimento nello schema?

Un esempio della funzionalità che voglio:

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

(define y 2)

(foo y)

(display y) ;outputs: 5
.

Inoltre, c'è un modo per tornare con riferimento?

È stato utile?

Soluzione

Vedi http://community.schemewiki.org/?scheme-faq-Language Domanda "C'è un modo per emulare call-by-reference?".

In generale penso che combatte la natura funzionale del regime, così probabilmente c'è un modo migliore per strutturare il programma per renderlo più schema.

Altri suggerimenti

Come disse Jari, di solito vuoi evitare di passare per riferimento nel regime in quanto suggerisce che stai abuso di effetti collaterali.

Se si desidera, tuttavia, è possibile racchiudere tutto ciò che si desidera passare per riferimento in una scatola cons.

(cons 5 (void))
.

produrrà una casella contenente 5. Se si passa questa casella a una procedura che modifica il 5 a 6 a 6, la casella originale conterrà anche un 6. Certo, è necessario ricordare a cons e car quando appropriato. .

Lo schema Chez (e possibilmente altre implementazioni) ha una procedura chiamata box (e i suoi compagni box? e unbox) specificamente per questa assurdità di inscatolamento / unboxing: http://www.scheme.com/csug8/objects.html#./objects:s43

È possibile utilizzare una 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 ha ragione è un po 'anch'emesso come passare per riferimento, almeno con variabili.Tuttavia, il comportamento che desideri è usato e spesso incoraggiato, tutto il tempo in un programma più simile a un modo utilizzando chiusure. Pagine 181 e182 (Google Libri) nello schema condito fai un lavoro migliore, allora posso spiegarlo.

Ecco un riferimento che fornisce una macro che consente di utilizzare una sintassi di C come "passare per riferimento".Il sito Olegs è una miniera d'oro per letture interessanti, quindi assicurati di prenotare il contrassegno se non lo hai già.

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

È possibile influire su un contesto esterno da una funzione definita in tale contesto esterno, che offre l'influenza del passaggio per variabili di riferimento, cioè funzioni con effetti collaterali.

(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
.

Questa soluzione limita la portata degli effetti collaterali.

Altrimenti c'è (definisci x (casella 5)), (UNBOX X), ecc. Come menzionato in un componente di ELI, che è lo stesso della soluzione Contro suggerita da Erjiang.

Probabilmente hai usato troppo di c, php o altro. Nella combinazione non vuoi fare cose come il pass-by- *. Comprendi prima quale ambito significa e in che modo la diversa implementazione si comporta (in particolare prova a capire qual è la differenza tra liscio e schema).

Per essenza un linguaggio di programmazione puramente funzionale non ha effetto collaterale.Di conseguenza, significa che il pass-by-ref non è un concetto funzionale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top