2009-10-02 9 views
14

Sto valutando/testando un'applicazione basata su browser presumibilmente scritta in common lisp. Oltre all'interfaccia basata su browser, il software fornisce una finestra 'Listener' con un prompt REPL 'CL-User'.Come esaminare l'elenco delle funzioni definite dal prompt Common Lisp REPL

Desidero esaminare l'elenco di funzioni, simboli e pacchetti dal prompt REPL. In modo da poter co-relazionare la funzionalità del frontend con ciò che è esposto tramite REPL.

La ricerca su Google è inutile per me in quanto conduce a tutorial e risorse che insegnano passo dopo passo.

Qualsiasi suggerimento, i suggerimenti sull'esame dello stato tramite REPL saranno molto apprezzati.

risposta

8

Se non si sa cosa i simboli che stai cercando, ma sappi quali pacchetti vuoi cercare, puoi ridurre drasticamente la quantità di ricerche che devi fare solo elencando i simboli da quei pacchetti specifici:

(defun get-all-symbols (&optional package) 
    (let ((lst()) 
     (package (find-package package))) 
    (do-all-symbols (s lst) 
     (when (fboundp s) 
     (if package 
      (when (eql (symbol-package s) package) 
       (push s lst)) 
      (push s lst)))) 
    lst)) 

(get-all-symbols 'sb-thread) ; returns all the symbols in the SB-THREAD package

La riga (get-all-symbols 'sb-thread) fa proprio questo.

Se avete un'idea su che tipo di simboli che stai cercando, e vuole prendere un'indovinare i loro nomi, si può fare questo

(apropos-list "mapc-") ; returns (SB-KERNEL:MAPC-MEMBER-TYPE-MEMBERS SB-PROFILE::MAPC-ON-NAMED-FUNS) 
(apropos-list "map" 'cl) ; returns (MAP MAP-INTO MAPC MAPCAN MAPCAR MAPCON MAPHASH MAPL MAPLIST)

(apropos-list) restituisce tutti i simboli il cui nome contiene la stringa si passa, e prende un pacchetto opzionale per la ricerca.

Per quanto capire che cosa tutti quei simboli fanno, beh, provate questo: http://www.psg.com/~dlamkins/sl/chapter10.html

+0

Aha (apropos-list) che cosa ha ordinato il dottore. Grazie anche per il link. –

4
(let ((lst()))              
    (do-all-symbols (s lst) 
    (when (fboundp s) (push s lst))) 
    lst) 

Praticamente preso così com'è da here.

+0

ho fatto atterrare sulla pagina hai suggerito tramite la ricerca Google prima della pubblicazione qui. Ma non è stato in grado di capire quanto sopra per conto mio. Grazie per il codice cristallino. –

6

per elencare tutti i pacchetti (stato derubato):

(list-all-packages) 

Per trovare funzioni esportate da un particolare pacchetto:

(loop for x being the external-symbol of "CL" when (fboundp x) collect x) 
+0

Facile capire un liner per "proceduralmente viziato". Grazie. –

6

elencare tutto:

(apropos "") 

elencare tutto da uno specifico pacchetto aggiuntivo 'nome-progetto:

(apropos "" 'quickproject) 
0

Forse qualcosa di simile:

(defun get-symbols-in-package (&optional (package *package*)) 
      (let ((lst())) 
      (do-symbols (s package) 
       (push s lst)) 
      lst)) 

Usa come (get-symbols-in-package) o (get-symbols-in-package 'foo) ...