How to determine if function is defined

Q&A's, tips, howto's

How to determine if function is defined

Postby 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.
neil456
 
Posts: 12
Joined: Tue Feb 03, 2015 5:32 pm
Location: Kansas City, MO

Re: How to determine if function is defined

Postby 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
Lutz
 
Posts: 5276
Joined: Thu Sep 26, 2002 4:45 pm
Location: Pasadena, California

Re: How to determine if function is defined

Postby 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

Re: How to determine if function is defined

Postby 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?
neil456
 
Posts: 12
Joined: Tue Feb 03, 2015 5:32 pm
Location: Kansas City, MO

Re: How to determine if function is defined

Postby 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)
>
Lutz
 
Posts: 5276
Joined: Thu Sep 26, 2002 4:45 pm
Location: Pasadena, California


Return to newLISP in the real world

Who is online

Users browsing this forum: No registered users and 1 guest

cron