From: Javier Fernandez
Subject: variable actualization problem
Date: 
Message-ID: <3325D52A.703E@kender.es>
Hello:

I'm learning Lisp and I don't know much about it,
I'd like that somebody explains me the next situation:

I got four functions:

;********************************************************
(DEFUN LEER (CINTA POS)
	(NTH POS CINTA)
)
;********************************************************
(DEFUN ESCRIBIR (CINTA POS SIMBOLO)
	(APPEND (BUTLAST CINTA (- (LENGTH CINTA) POS))
		(LIST SIMBOLO)
		(NTHCDR (+ POS 1) CINTA)
	)
)
;********************************************************
(DEFUN Q1 (CINTA POS)
	(COND	((EQUAL (LEER CINTA POS) '^)
			(Q2 CINTA (+ POS 1)))
	)
)
;********************************************************
(DEFUN Q2 (CINTA POS)
	(COND	((EQUAL (LEER CINTA POS) 1) 
			(Q3 (ESCRIBIR CINTA POS '^) POS))
		((EQUAL (LEER CINTA POS) '^)
			(QH (ESCRIBIR CINTA POS 'X) POS))		
	)
)
;********************************************************


when I invoke Q1 function all goes good, but imagine you that
all before functions are defined as i wrote before except Q1
that it's defined in the next way:

(DEFUN Q1 (CINTA POS)
	(COND	((EQUAL (LEER CINTA POS) '^) (+ POS 1)
					(Q2 CINTA POS))
	)
)


My question is: why the Q2 function is now invoked without
actualize the value of POS? Cos if I write (+ POS 1) before
(Q2 CINTA POS) it's reasonable to think that in the espresion
(Q2 CINTA POS) the value of POS be one more unit than the value
passed to the Q1 function.


Well, thank you


I'm beginner in Lisp programming and i got many doubts so
i'd like somebody explains me what i've said. Excuse my english.




Javi
From: Gareth McCaughan
Subject: Re: variable actualization problem
Date: 
Message-ID: <86ohcpwb6j.fsf@g.pet.cam.ac.uk>
Javier Fernandez <········@kender.es> writes:

> (DEFUN Q1 (CINTA POS)
> 	(COND	((EQUAL (LEER CINTA POS) '^) (+ POS 1)
> 					(Q2 CINTA POS))
> 	)
> )
> 
> 
> My question is: why the Q2 function is now invoked without
> actualize the value of POS? Cos if I write (+ POS 1) before
> (Q2 CINTA POS) it's reasonable to think that in the espresion
> (Q2 CINTA POS) the value of POS be one more unit than the value
> passed to the Q1 function.

It may be reasonable, but it's wrong. Evaluating (+ POS 1) just
returns POS+1; it doesn't change the value of POS. Things only
get changed when you actually ask for them to be.

It's like in mathematics; if you write the two equations
    y = f(x+1)
    z = a+b+x
the value of x hasn't changed between the first line and the second,
even though you did something using x+1.

-- 
Gareth McCaughan       Dept. of Pure Mathematics & Mathematical Statistics,
·····@dpmms.cam.ac.uk  Cambridge University, England.