<div dir="ltr">This definitely helps, and I hope I&#39;m using this user list correctly as this is my first time using one. This will indeed get me started, and will go over everything in depth later. That said, future comments or advice is much appreciated.<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, May 13, 2013 at 11:29 PM, Greg Hendershott <span dir="ltr">&lt;<a href="mailto:greghendershott@gmail.com" target="_blank">greghendershott@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The following is a bit of a brain dump and hopefully others will jump<br>
in with corrections or with differing opinons.<br>
<br>
Many web services give you a choice of getting the data as XML or as JSON.<br>
<br>
In this case, you&#39;re asking for JSON. But it&#39;s a JSON alternative<br>
representation of an Atom feed. Atom feeds natively are XML.<br>
<br>
In a language like JavaScript, it might be easier to deal with this as<br>
JSON. But in Racket, although you can certainly work with JSON just<br>
fine, it might be easier to deal with it as XML. Because there&#39;s a<br>
deep similarity between XML and s-expressions.<br>
<br>
&lt;foo&gt;&lt;bar&gt;&quot;hi&quot;&lt;/bar&gt;&lt;/foo&gt;  ;; HTML or XML<br>
<br>
is a more tedious way of saying:<br>
<br>
&#39;(foo (bar &quot;hi&quot;))   ;; a variety of s-expression called an x-expression<br>
<br>
- - -<br>
<br>
As Sean pointed out, you want to handle exceptions. `call-input/url`<br>
is your friend here.<br>
<br>
To keep our options open (about JSON vs. XML), let&#39;s define this helper:<br>
<br>
(require net/url)<br>
(define (get-yt uri read-func)<br>
  (call/input-url (string-&gt;url uri) get-pure-port read-func))<br>
<br>
Now if you want JSON, you can say:<br>
<br>
(require json)<br>
(define js<br>
  (get-yt &quot;<a href="http://gdata.youtube.com/feeds/api/videos/?alt=json&amp;v=2&amp;category=Movies&amp;q=Inception" target="_blank">http://gdata.youtube.com/feeds/api/videos/?alt=json&amp;v=2&amp;category=Movies&amp;q=Inception</a>&quot;<br>

          read-json))<br>
(pretty-print js)<br>
<br>
Or if you want XML, you can say:<br>
<br>
(require xml)<br>
(define xm<br>
  (get-yt &quot;<a href="http://gdata.youtube.com/feeds/api/videos/?v=2&amp;category=Movies&amp;q=Inception" target="_blank">http://gdata.youtube.com/feeds/api/videos/?v=2&amp;category=Movies&amp;q=Inception</a>&quot;<br>

          read-xml))<br>
(pretty-print xm)<br>
<br>
Note that the &quot;alt=json&quot; query parameter is deleted from the request<br>
URI in this example. We&#39;re asking YouTube for the primary format, XML,<br>
not the JSON alternative.<br>
<br>
Now, this will give you a bunch of Racket structs representing XML.<br>
Instead of those structs, you may want an &quot;x-expression&quot;, which is a<br>
representation like when I described above:<br>
<br>
    &lt;foo&gt; &lt;bar&gt; &quot;hi&quot; &lt;/bar&gt; &lt;/foo&gt;<br>
<br>
    is a more tedious way of saying:<br>
<br>
    &#39;(foo (bar &quot;hi&quot;))  ;; &lt;-- this<br>
<br>
For that, let&#39;s define a &quot;read-xml-&gt;xexpr&quot; function:<br>
<br>
(define (read-xml-&gt;xexpr in)<br>
  (xml-&gt;xexpr (document-element (read-xml in)))<br>
;; Or: (define read-xml-&gt;xexpr (compose1 xml-&gt;xexpr document-element read-xml))<br>
<br>
So now we can say:<br>
<br>
;; (require xml)<br>
(define x<br>
  (get-yt &quot;<a href="http://gdata.youtube.com/feeds/api/videos/?v=2&amp;category=Movies&amp;q=Inception" target="_blank">http://gdata.youtube.com/feeds/api/videos/?v=2&amp;category=Movies&amp;q=Inception</a>&quot;<br>

          read-xml-&gt;xexpr))<br>
(pretty-print x)<br>
<br>
This is an x-expression for the Atom feed. Each of the `(entry ...)`<br>
sub-lists is one of the search results.<br>
<br>
(feed<br>
  ...<br>
  (entry ...)<br>
  (entry ...)<br>
  ...)<br>
<br>
There are a variety of ways you could parse this, for example using<br>
`match`, but hopefully this is enough to get you going?<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On Mon, May 13, 2013 at 5:45 AM, Cody Goodman<br>
&lt;<a href="mailto:codygman.consulting@gmail.com">codygman.consulting@gmail.com</a>&gt; wrote:<br>
&gt; Hello, can anyone offer an idiom/thinking process/approach critique on my<br>
&gt; code below? I&#39;m new to racket and trying to program in racket, not program<br>
&gt; python in racket syntax ;)<br>
&gt;<br>
&gt; #lang racket<br>
&gt; (require json)<br>
&gt; (require net/url)<br>
&gt;<br>
&gt; (define data-set<br>
&gt;   (let* (<br>
&gt;          ;; Turn url into a net/url-struct so you can allow a different<br>
&gt; search query as well as other customizations<br>
&gt;          ;; easily.<br>
&gt;          [api-url (string-&gt;url<br>
&gt; &quot;<a href="http://gdata.youtube.com/feeds/api/videos/?alt=json&amp;v=2&amp;category=Movies&amp;q=Inception" target="_blank">http://gdata.youtube.com/feeds/api/videos/?alt=json&amp;v=2&amp;category=Movies&amp;q=Inception</a>&quot;)]<br>

&gt;          ;; figure out how to use call/input url<br>
&gt;          [in (get-pure-port api-url #:redirections 2)]<br>
&gt;          [json-blob (read-json in)])<br>
&gt;     (close-input-port in)<br>
&gt;     json-blob))<br>
&gt;<br>
&gt; (struct movie (title price link))<br>
&gt; (define movies (hash-ref (hash-ref data-set &#39;feed) &#39;entry))<br>
&gt;<br>
&gt; (define (make-movie movie-result)<br>
&gt;   (let* (<br>
&gt;          [title (hash-ref (hash-ref movie-result &#39;title) &#39;$t)]<br>
&gt;          [price (with-handlers ([exn:fail? (lambda (exn) 0)])<br>
&gt;                   (hash-ref (car (hash-ref (hash-ref movie-result<br>
&gt; &#39;media$group) &#39;media$price)) &#39;price))]<br>
&gt;          [link (hash-ref (car (hash-ref movie-result &#39;link)) &#39;href)]<br>
&gt;          [movie-to-return (movie title price link)])<br>
&gt;     movie-to-return))<br>
&gt;<br>
&gt; (define (make-movie-listing movie)<br>
&gt;   (list (movie-title movie) (movie-price movie) (movie-link movie)))<br>
&gt;<br>
&gt; (define (show-all-movie-listings)<br>
&gt; (map make-movie-listing (map make-movie movies)))<br>
&gt;<br>
&gt; (define (get-relevant-movie-listings movie)<br>
&gt;   ;; TODO: Figure out how to pass paramters into a function with map. Maybe<br>
&gt; lambda?<br>
&gt;   (cond<br>
&gt;     [(string=? (movie-title movie) &quot;Inception&quot;) movie]))<br>
&gt;<br>
&gt; ;; TODO: Make this into a function after figuring out how to pass parameters<br>
&gt; into a function with map.<br>
&gt; (define find-movie<br>
&gt;   (car(map get-relevant-movie-listings (map make-movie movies))))<br>
&gt;<br>
&gt; (define inception-movie find-movie)<br>
&gt; (movie-title inception-movie)<br>
&gt;<br>
&gt; ____________________<br>
&gt;   Racket Users list:<br>
&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
</div></div></blockquote></div><br></div>