2009-09-09 20 views
6

ile ilgili basit bir sorun Sadece LISP'yi kullanmaya başladım. C'deki bir arka plandan geliyordum. Şimdiye kadar inanılmaz bir öğrenme eğrisine sahip olmakla birlikte (eğlenceli bir emarasım da). Her neyse, c kaynağından gelen ifadeleri ayrıştırmak için aşağıdaki kodla aptalca bir sorun yaşıyorum - bu konuda yorum yapabilir ve bir çözüm önerebilirse, çok yardımcı olacaktır. + (LISP)

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

Ben gerçek sonuç

"#include <stdio.h>" 

Herhangi bir düşünce olduğu ancak son satırı

"<stdio.h>" 

dönmek bekliyoruz?

cevap

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

* slaps alin * tabi ki, mantığım sadece yanlıştı. - 2.günün nasıl gittiğini göreceğiz :-) – Justicle

1

replace-in-string'u daha kolay buluyorum. Adından da anlaşılacağı gibi kodu için

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

, include-start, maçın başlamasını döndürür. Muhtemelen hangi include-end aradığınız (+ (include-start ....) (length ....))

+0

nerede 'yerine-in-string' - bu standart bir fonksiyondur? Darwin'de Closure Common Lisp kullanıyorum. – Justicle

+0

Ah Elisp'i kullandığınızı sanıyordum. –

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