Q&A's, tips, howto's
			
		
		
			
				
																			
								lyl 							 
									
		Posts:  44 Joined:  Sun Mar 25, 2018 5:00 am 
		
						
						
													
							
						
									
						Post 
					 
								by lyl  Sun Aug 30, 2020 12:35 am 
			
			
			
			
			I use a function "f" to store data by calling another function "g" like this:
Code: Select all 
(define (g (x y)) x)
(define (f data)
  (setf (nth '(0 0 1) g) data)
  )
  
;;test:
(f 1) 
(g) ;; -> 1  Right. This is what I want.
(g) ;; -> 1  Right. This is what I want.
(f '(+ 1 2))
(g) ;; -> 3  This is not what I want. I can't understand why the quoted list '(+ 1 2) is evaluated?. I just want to get the list itself '(+ 1 2)
By contrast,
Code: Select all 
(define (g x) x)
(define (f data) (g data))
(f '(+ 1 2)) ;; -> (+ 1 2)   The list is not evaled.
Is there a better way to prevent this kind of unwanted eval during the parameter transfer?
 
		 
				
		
		 
	 
	
		
		
			
				
																			
								newBert 							 
									
		Posts:  156 Joined:  Fri Oct 28, 2005 5:33 pmLocation:  France 
		
						
						
													
							
						
									
						Post 
					 
								by newBert  Mon Aug 31, 2020 1:16 pm 
			
			
			
			
			One possibility, probably among others:
Code: Select all 
> (define (g (x nil)) x)
(lambda ((x nil)) x)
> (define-macro (f) (setf (nth '(0 0 1) g) (args 0)))
(lambda-macro () (setf (nth '(0 0 1) g) (args 0)))
> (f 1)
1
> (g)
1
> (f '(+ 1 2))
'(+ 1 2)
> (g)
(+ 1 2)P.S. : I preferred (args 0) instead of 'data' for macro 'f' to avoid variable capture in passed parameters
Bertrand  − newLISP  v.10.7.6 64-bit on Linux  (Linux Mint 20.1 )