Using Wolfram Alpha from Clojure
I have been blown away in the last year by Wolfram Alpha but I haven't done much with the developer's APIs. To make it easier to experiment with Wolfram Alpha, I wrote a simple Clojure wrapper for the Java APIs. You can get a copy at github.
In case you don't want to grab the github repo, here is most of the code:
(ns wolfram) (def appid (System/getenv "WOLFRAM_APP_ID")) (def engine (com.wolfram.alpha.WAEngine.)) (.setAppID engine appid) (.addFormat engine "plaintext") (defn query [input] (let [query (.createQuery engine)] (.setInput query input) (let [result (.performQuery engine query)] {:pods (for [pod (.getPods result)] {:title (.getTitle pod) :sub-pods (for [sub-pod (.getSubpods pod)] (for [contents (.getContents sub-pod)] (.getText contents)))})})))Notice that you need to set the API key for your application in an environment variable. You get 2000 free API calls a month. Here is some sample output (with some output removed for brevity):
test=> (query "distance between San Diego and San Francisco") {:pods ({:title "Input interpretation", :sub-pods (("distance | from | San Diego, California\nto | San Francisco, California"))} {:title "Result", :sub-pods (("453.7 miles"))} {:title "Unit conversions", :sub-pods (("730.2 km (kilometers)") ("730194 meters") ("7.302?10^7 cm (centimeters)") ("394.3 nmi (nautical miles)"))} {:title "Direct travel times", :sub-pods (("aircraft (550 mph) | 49 minutes 30 seconds\nsound | 36 minutes\nlight in fiber | 3.41 ms (milliseconds)\nlight in vacuum | 2.44 ms (milliseconds)\n(assuming constant-speed great-circle path)"))} {:title "Map", :sub-pods ((""))})} user=> (query "pi") {:pods ({:title "Input", :sub-pods (("pi"))} {:title "Decimal approximation", :sub-pods (("3.1415926535897932384626433832795028841971693993751058..."))} {:title "Property", :sub-pods (("pi is a transcendental number"))} {:title "Number line", :sub-pods ((""))} {:title "Continued fraction", :sub-pods (("[3; 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 2, 1, 1, 2, 2, 2, 2, 1, 84, 2, 1, 1, 15, ...]"))} {:title "Alternative representations", :sub-pods (("pi = 180 ?") ("pi = -i log(-1)") ("pi = cos^(-1)(-1)"))} {:title "Series representations", :sub-pods (("pi = 4 sum_(k=0)^infinity(-1)^k/(2 k+1)") ("pi = -2+2 sum_(k=1)^infinity2^k/(binomial(2 k, k))") ("pi = sum_(k=0)^infinity(50 k-6)/(2^k binomial(3 k, k))"))} {:title "Integral representations", :sub-pods (("pi = 2 integral_0^infinity1/(t^2+1) dt") ("pi = 4 integral_0^1 sqrt(1-t^2) dt") ("pi = 2 integral_0^infinity(sin(t))/t dt"))})}
Comments
Post a Comment