2009-09-09 8 views
6

Właśnie zacząłem używać LISP-a, pochodzącego z tła w C. Do tej pory było fajnie, chociaż z niewiarygodną krzywą uczenia się (jestem też nowicjuszem emacs).Prosty problem z subseq (LISP)

W każdym razie mam głupi problem z następującym kodem do przeanalizowania, zawierającym instrukcje od źródła c - jeśli ktokolwiek może skomentować to i zaproponować rozwiązanie, bardzo by to pomogło.

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

Spodziewam ostatnia linia powrotu

"<stdio.h>" 

Jednak rzeczywisty wynik jest

"#include <stdio.h>" 

jakieś przemyślenia?

Odpowiedz

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

* uderza głową w czoło * oczywiście, moja logika była po prostu błędna - zobaczymy, jak minie dzień 2 :-) – Justicle

1

Znacznie łatwiej znaleźć replace-in-string.

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

Dla kodzie include-start zwraca rozpoczęcia meczu, jak sama nazwa wskazuje. Szukasz include-end który jest prawdopodobnie (+ (include-start ....) (length ....))

+0

Gdzie jest „wymianę w ciągu znaków” - jest to standardowa funkcja? Używam Closure Common Lisp na Darwinie. – Justicle

+0

Och, myślałem, że używasz elisp. –

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