Pergunta

Como eu posso passar uma variável por referência, em regime?

Um exemplo de funcionalidade que eu quero:

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

(define y 2)

(foo y)

(display y) ;outputs: 5

Além disso, existe uma maneira de retornar por referência?

Foi útil?

Solução

Ver http://community.schemewiki.org/?scheme-faq-language pergunta: "existe uma maneira de emular chamadas call-by-reference?".

Em geral, eu acho que a luta contra o regime funcional de natureza, então provavelmente não é a melhor maneira de estruturar o programa para torná-lo mais esquema de como.

Outras dicas

Como Jari disse que, normalmente, você deseja evitar a passagem por referência, em Regime de como ele sugere que você está abusando de efeitos colaterais.

Se você quiser, você pode colocar qualquer coisa que você queira passar por referência, em um cons a caixa.

(cons 5 (void))

vai produzir uma caixa contendo 5.Se você passar essa caixa para um procedimento que altera a 5 para 6, a caixa original também irá conter um 6.Claro, você tem que se lembrar de cons e car quando apropriado.

Chez Regime (e, possivelmente, outras implementações) tem um procedimento chamado box (e os seus companheiros box? e unbox especificamente para esta boxe/unboxing absurdo: http://www.scheme.com/csug8/objects.html#./objects:s43

Você pode usar uma 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 é certo que é um pouco unscheme-gostaria de passar por referência, pelo menos com variáveis.No entanto, o comportamento que você quer é usada, e muitas vezes incentivada, o tempo todo, em mais um esquema de como a maneira pela utilização de fechamentos. Páginas 181 e 182(pesquisa de livros do google) no experientes esquema de fazer um melhor trabalho, então eu posso explicar isso.

Aqui é uma referência que dá uma macro que permite a utilização de uma sintaxe parecida com c a 'passagem por referência.' Olegs site é uma mina de ouro para interessantes leituras portanto, certifique-se simplesmente marcá-lo se você não tiver já.

http://okmij.org/ftp/Scheme/pointer-as-closure.txt

Você pode afectar o exterior contexto de dentro de uma função definida no exterior contexto, o que dá o efeito de passar por fazer referência a variáveis, i.e.funções com efeitos colaterais.

(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

Esta solução limita o âmbito de aplicação dos efeitos colaterais.

Caso contrário, existe (define x (caixa 5)), (unbox x), etc.como mencionado em um subcomment por Eli, que é o mesmo como os contras solução sugerida pela erjiang.

Você provavelmente já utilizam muito da C, PHP, ou qualquer que seja.Em regime de você não querer fazer coisas como passar-por-*.Entender primeiro o que o escopo significam e como a implementação diferente de se comportar (em particular, tentar descobrir qual é a diferença entre o LISP e Scheme).

Por essência uma linguagem de programação puramente funcional não tem efeito colateral.Consequentemente, isso significa que passar-por-ref não é um conceito funcional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top