Q&A's, tips, howto's
			
		
		
			
				
																			
								neil456 							 
									
		Posts:  12  		Joined:  Tue Feb 03, 2015 5:32 pm 		
		
											Location:  Kansas City, MO 
							
						
		 
		
						
						
													
							
						
									
						Post 
					 
								by neil456   »  Thu Feb 05, 2015 10:28 pm 
			
			
			
			
			What is the correct way to determine that a function is defined.  I am conditionally importing from a C lib and need to determine if the function was actually imported.
This is the import function.
Code: Select all 
(define (pg_import_warn fun_name)
  (if (not (catch (import library fun_name "cdecl") 'pg_load_error))
    (println "pg_import WARNING: " pg_load_error)))
Import is done like this
Code: Select all 
(pg_import_warn "PQescapeIdentifier")
Then sometime later i want to be able to do something like
Code: Select all 
(if (function? PQescapeIdentifier)  (PQescapeIdentifier text) (SomeOtherFuncton text))
to use the function or not as the case may be.
 
			
			
									
									
						 
		 
				
		
		 
	 
	 
				
		
		
			
				
																			
								Lutz 							 
									
		Posts:  5289  		Joined:  Thu Sep 26, 2002 4:45 pm 		
		
																Location:  Pasadena, California 
							
							
				Contact: 
				
			 
				
		 
		
						
						
													
							
						
									
						Post 
					 
								by Lutz   »  Thu Feb 05, 2015 11:27 pm 
			
			
			
			
			Just use the 
primitive?  predicate, which works on built-in and imported functions:
Code: Select all 
> (import "libc.dylib" "printf")
printf@7FFF8BF44910
> (primitive? printf)
true
>
or after loading postgres.lsp
Code: Select all 
> (primitive? PgSQL:PQconnectdb)
true
>
for user-defined functions you would use 
lambda? 
Code: Select all 
> (define (double x) (+ x x))
(lambda (x) (+ x x))
> (lambda? double)
true
 
			
			
									
									
						 
		 
				
		
		 
	 
	 
				
		
		
			
				
																			
								neil456 							 
									
		Posts:  12  		Joined:  Tue Feb 03, 2015 5:32 pm 		
		
											Location:  Kansas City, MO 
							
						
		 
		
						
						
													
							
						
									
						Post 
					 
								by neil456   »  Thu Feb 05, 2015 11:37 pm 
			
			
			
			
			Excellent, thanks 
Neil
			
			
									
									
						 
		 
				
		
		 
	 
	 
				
		
		
			
				
																			
								neil456 							 
									
		Posts:  12  		Joined:  Tue Feb 03, 2015 5:32 pm 		
		
											Location:  Kansas City, MO 
							
						
		 
		
						
						
													
							
						
									
						Post 
					 
								by neil456   »  Sun Feb 08, 2015 8:09 pm 
			
			
			
			
			Still having a problem with this. Consider the following example:
Code: Select all 
(dolist (symb (symbols PgSQL))
	(if (lambda? symb)
		(println "found function: " symb)))
This does not work, so how do I get a list of symbols in a context that have lambda expressions assigned to them?
 
			
			
									
									
						 
		 
				
		
		 
	 
	 
				
		
		
			
				
																			
								Lutz 							 
									
		Posts:  5289  		Joined:  Thu Sep 26, 2002 4:45 pm 		
		
																Location:  Pasadena, California 
							
							
				Contact: 
				
			 
				
		 
		
						
						
													
							
						
									
						Post 
					 
								by Lutz   »  Sun Feb 08, 2015 8:43 pm 
			
			
			
			
			The 
lambda?  predicate is applied not to the symbol, but what is inside:
Code: Select all 
(dolist (symb (symbols PgSQL))
 (if (lambda? (eval symb))
    (println "found function: " symb)))
found function: PgSQL:NULL?
found function: PgSQL:affected-rows
found function: PgSQL:clear-result
...
or shorter:
Code: Select all 
> (filter (fn (s) (lambda? (eval s))) (symbols PgSQL))
(PgSQL:NULL? PgSQL:affected-rows PgSQL:clear-result PgSQL:close-db PgSQL:connect 
 PgSQL:connectdb PgSQL:data-seek PgSQL:databases PgSQL:error PgSQL:escape PgSQL:fetch-all 
 PgSQL:fetch-row PgSQL:fetch-value PgSQL:fields PgSQL:fnumber PgSQL:num-fields PgSQL:num-rows 
 PgSQL:query PgSQL:tables)
>