2009-09-09 8 views
6

Ho appena iniziato a usare LISP, provenendo da uno sfondo in C. Finora è stato divertente, anche se con una curva di apprendimento incredibile (anch'io sono un principiante di emacs).Semplice problema con subseq (LISP)

In ogni caso, sto avendo un problema stupido con il seguente codice per analizzare le istruzioni di inclusione da c source - se chiunque può commentare questo e suggerire una soluzione, sarebbe di grande aiuto.

(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>") 

mi aspetto l'ultima linea per tornare

"<stdio.h>" 

Tuttavia il risultato effettivo è

"#include <stdio.h>" 

Qualche idea?

risposta

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

* schiaffi sulla fronte * ovviamente, la mia logica era semplicemente sbagliata - vedremo come andrà il giorno 2 :-) – Justicle

1

Trovo più semplice lo replace-in-string.

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

Per il vostro codice, include-start restituisce l'inizio della partita, come suggerisce il nome. Siete alla ricerca di include-end che è probabilmente (+ (include-start ....) (length ....))

+0

Dove è 'sostituire-in-string' - è una funzione standard? Sto usando Closure Common Lisp su Darwin. – Justicle

+0

Oh pensavo che stavi usando l'elisp. –

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