2009-09-09 7 views
6

Acabo de empezar a usar LISP, que proviene de un fondo en C. Hasta ahora ha sido divertido, aunque con una curva de aprendizaje increíble (también soy un novato de emacs).Problema simple con subseq (LISP)

De todos modos, estoy teniendo un problema tonto con el siguiente código para analizar declaraciones incluidas de c fuente: si alguien puede comentar sobre esto y sugerir una solución, sería de gran ayuda.

(defun include-start (line) 
    (search "#include " line)) 

(defun get-include(line) 
    (let ((s (include-start line))) 
    (if (not (eq NIL s)) 
     (subseq line s (length line))))) 

(get-include "#include <stdio.h>") 

espero que la última línea para volver

"<stdio.h>" 

Sin embargo, el resultado real es

"#include <stdio.h>" 

¿Alguna idea?

Respuesta

6
(defun include-start (line) 
    "returns the string position after the '#include ' directive or nil if none" 
    (let ((search-string "#include ")) 
    (when (search search-string line) 
     (length search-string)))) 

(defun get-include (line) 
    (let ((s (include-start line))) 
    (when s 
     (subseq line s)))) 
+1

* golpea la frente * por supuesto, mi lógica era simplemente incorrecta - veremos cómo va el día 2 :-) – Justicle

1

Encuentro replace-in-string mucho más fácil.

(replace-in-string "#include <stdio.h>" "#include +" "") 
    => "<stdio.h>" 

Para su código include-start, devuelve el comienzo del partido, como su nombre indica. Que busca include-end que es probablemente (+ (include-start ....) (length ....))

+0

¿Dónde está 'reemplazar-en-cadena' - es una función estándar? Estoy usando Closure Common Lisp en Darwin. – Justicle

+0

Oh, pensé que estabas usando elisp. –

1
(defun get-include (s) 
    (subseq s (mismatch "#include " s)))