On Mon, Dec 22, 2008 at 1:30 AM, Michael Wood <[email protected]> wrote:
> On Sun, Dec 21, 2008 at 7:03 PM, Adam Harrison (Clojure)
> <[email protected]> wrote:
> [...]
>> (defmacro where [& triples]
>> `(let [encode# (fn [x#] (cond (and (symbol? x#) (= (first (name x#))
>> \?)) (name x#)
>> (integer? x#) (str "\"" x# "\"^^xsd:integer")
>> (float? x#) (str "\"" x# "\"^^xsd:decimal")
>> (string? x#) (str "\"" x# "\"")))]
>> (apply str
>> (interpose " .\n"
>> (for [triple# '~triples]
>> (apply str
>> (interpose " "
>> (map encode# triple#))))))))
>>
>> As you can see, so far it correctly encodes SPARQL capture variables,
>> and literal strings, integers and floats:
>>
>> user=> (print (where (?a ?b 1) (?a ?b 2.0) (?a ?b "string")))
>> ?a ?b "1"^^xsd:integer .
>> ?a ?b "2.0"^^xsd:decimal .
>> ?a ?b "string"
>>
>> I tried adding '(list? x#) (eval x#)' to the encode cond to make it cope
>> with expressions like this:
>>
>> (where (?a ?b (+ 1 2)))
>>
>> Unfortunately that results in an unencoded literal '3' in the query
>> string instead of the '"3"^^xsd:integer' I was looking for. I tried
This seems to be a lot simpler if you use keywords instead of ?something:
user=> (defmacro encode [x]
`(let [x# ~x]
(cond (keyword? x#) (str \? (name x#))
(integer? x#) (str \" x# \" "^^xsd:integer")
(float? x#) (str \" x# \" "^^:decimal")
(string? x#) (str \" x# \")
:else (throw (new Exception "Invalid SPARQL atom")))))
nil
user=> (println (encode :a))
?a
nil
user=> (println (encode 1))
"1"^^xsd:integer
nil
user=> (println (encode 2.0))
"2.0"^^:decimal
nil
user=> (println (encode "string"))
"string"
nil
user=> (println (encode (+ 1 2)))
"3"^^xsd:integer
nil
user=> (println (encode (keyword "b")))
?b
nil
user=> (println (encode 'invalid))
java.lang.Exception: Invalid SPARQL atom (NO_SOURCE_FILE:0)
user=> (println (encode 1/2))
java.lang.Exception: Invalid SPARQL atom (NO_SOURCE_FILE:0)
user=>
--
Michael Wood <[email protected]>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---