Live data from Hacker News

Land Of Lisp chapter 7 - Using SBCL

blog.ciaranbradley.com

11–15 of 15 posts

Re: Land Of Lisp chapter 7 - Using SBCL

#11
post #5

Earlier quoted context omitted.

Also, you might find this slow little utility for converting a bunch of stuff into strings. It will do the job nicely, and it accepts every Lisp type. (defun str (&rest strings) (apply 'concatenate 'string (loop for x in strings collecting (format nil "~a" x)))) You can use it like this: (shell (str "dot -Tpng -O " fname)) You might also find that WITH-OPEN-FILE arguments can get a little unwieldy to type in the repl…

How about simply this? (defun str (&rest strings) (format nil "~{~A~}" strings))

I consciously avoided that because FORMAT and LOOP mastery is something that should wait until one knows Lisp well. Introduced too early, they can either scare someone (in the case of format) or tempt one to start writing Pascal (in the case of loop; which is why deliberately used it for its collected result, and not its side-effect, as more common.)

FWIW, my first Lisp programs where board-games and I learned quite a bit about recursion trying to format ASCII art in curses. If I knew FORMAT had control, I wouldn't have learned much lisp so quickly, since quirky little DSLs are fascinating.

Re: Land Of Lisp chapter 7 - Using SBCL

#12
Here's a function to create svg (default) or jpg for both sbcl and lispworks from graphviz:

(defun make-svg (file-name &key jpg)

    #+lispworks (sys:call-system-showing-output
                 (string+ cl-user::*organontech-graphviz* (if jpg " -Tjpg " " -Tsvg ")
                          cl-user::*fcgaa-lean-mapping-path*
                          "/" file-name ".dot"
                          " -o "
                          cl-user::*fcgaa-lean-mapping-path*
                          "/" file-name (if jpg ".jpg" ".svg")))
    #+sbcl (sb-ext:run-program cl-user::*organontech-graphviz*
                                 (list (if jpg "-Tjpg" "-Tsvg")
                                       (string+ cl-user::*fcgaa-lean-mapping-path* "/" file-name ".dot")
                                       "-o"
                                       (string+ cl-user::*fcgaa-lean-mapping-path* "/" file-name (if jpg ".jpg" ".svg")))
                                 :output (weblog-stream)
                                 )
    )
(defun weblog-stream ()

  (or (net.aserve:vhost-log-stream (net.aserve:wserver-default-vhost net.aserve:*wserver*))
      t)) ;;sends output directly to html stream on portable allegroserve
(defmacro string+ (string &rest strings) `(concatenate 'string ,string ,@strings))

Re: Land Of Lisp chapter 7 - Using SBCL

#13
I use this. This makes the "shell" command work in SBCL, and does nothing in CLISP or any other implementation.

  #+sbcl
  (defun shell (x)
    (run-program "/bin/sh" (list "-c" x) :output t))
Tell me if you want it to work in an implementation other than CLISP or SBCL, and if I can install it on my computer, then I'll figure it out.

Re: Land Of Lisp chapter 7 - Using SBCL

#14
post #6

Earlier quoted context omitted.

Cheers, I thought there might be something that was QL installable but didn't want to get sidetracked from the task at hand. I'll have a play with that in the morning :)

Enjoy yourself! Of course, you're more than welcome to shoot me an email if you ever get stuck. Here is a far more forgiving reference to Common Lisp than the Hyperspec, though don't let the fancy TeX typesetting intimidate you. http://clqr.berlios.de/clqr-a4-consec.pdf In addition to that, I think you should dump yourself a nice image with ASDF and QL builtin, so you don't have to load them every time.

Thanks again for the advice, and the offer. Be warned, I may take you up on it :)

I shall investigate creating that image. I found ASDF to be a bit problematic when I tried it on it's own (which is probably down to my inexperience), but QL worked first time.

Re: Land Of Lisp chapter 7 - Using SBCL

#15
post #5

Earlier quoted context omitted.

Also, you might find this slow little utility for converting a bunch of stuff into strings. It will do the job nicely, and it accepts every Lisp type. (defun str (&rest strings) (apply 'concatenate 'string (loop for x in strings collecting (format nil "~a" x)))) You can use it like this: (shell (str "dot -Tpng -O " fname)) You might also find that WITH-OPEN-FILE arguments can get a little unwieldy to type in the repl…

How about simply this? (defun str (&rest strings) (format nil "~{~A~}" strings))

I use:

(defmacro str (string &rest strings)

`(concatenate 'string ,string ,@strings))

Post reply on HN