2013-04-20 11 views
5

Używam parsowania tekstu w REPL, a czasem chcę zrzucić cały szereg danych do łańcucha znaków, niezależnie od tego, czy jest to wpis bibtex, czy notacja EBNF itp. Zazwyczaj w łańcuchu mogą znajdować się cudzysłowy, jest to bardzo uciążliwe i podatne na błędy musiał ręcznie je uciec ..Łatwy sposób pracy z tekstem bez konieczności ucieczki z cudzysłowu w Clojure?

Czy istnieje alternatywny sposób to zrobić, takich jak Ruby %Q|I mogą korzystać "Quotation Marks"| lub heredocs itp? A może byłoby możliwe napisanie makra lub modyfikacji czytnika, aby to umożliwić?

+0

To jest coś chciałem też. Jednym ze sposobów obejścia tego problemu jest odczytanie go z pliku z 'slurp'. – DaoWen

+0

Czy "dumpingu" w kodzie środowiska wykonawczego lub w edytorze. Jeśli później, zobacz to pytanie: http://stackoverflow.com/questions/11043318/does-clojure-have-raw-string – noahlz

+0

Jakiego edytora używasz? Moje zwykłe podejście do tego typu rzeczy polega na użyciu edytora z funkcją inteligentnego wklejania, który dodaje dla mnie ucieczkę. – Korny

Odpowiedz

0

Pojawiła się some discussion o bardziej niezawodnej składni cytowania, ale żadne zmiany, które ją obsługują, wydają się nieuchronne.

W międzyczasie, aby szczegółowo opisać interakcję REPL, o której wspomniałeś, może się okazać, że jest to przydatne. Zauważ, że prawdopodobnie nie działa dla każdego REPL tam - nie wszyscy wsparcia read-line strasznie dobrze:

 
(defn read-lines [] 
    (->> (repeatedly read-line) 
     (take-while #(not= % ".")) 
     (mapcat #(list % "\n")) 
     (apply str))) 

Użyj go uruchamiając (read-lines) w REPL, wklejając zawartość, a następnie dodanie odpowiedniego wiersza z . sama:

 
user=> (read-lines) 
    #_=> This "works" 
    #_=> sometimes... 
    #_=> . 
"This \"works\"\nsometimes...\n" 
user=> (print *1) 
This "works" 
sometimes... 
nil 
-1

Jak o po prostu stosując temp plik, do którego można zrzucić swój tekst, a następnie odczytać go stamtąd za pomocą slup? W ten sposób wszystko jest automatycznie ucieka, kiedy go nazwiesz?

(slurp "tempfile.txt") 

lub

(def data (slurp "tempfile.txt")) 

lub

(defn rd [] (def data (slurp "tempfile.txt")))