[HN Gopher] (learn 'scheme)
___________________________________________________________________
(learn 'scheme)
Author : josh-sematic
Score : 158 points
Date : 2023-10-29 14:30 UTC (8 hours ago)
(HTM) web link (jaredkrinke.github.io)
(TXT) w3m dump (jaredkrinke.github.io)
| gus_massa wrote:
| It's nice that the site can run the examples. Did you wrote the
| interpreter?
| schemescape wrote:
| Pleasantly surprised to see this on HN! This is an old (and
| incomplete) project of mine to reformat Structure and
| Interpretation of Computer Programs into a browser-friendly
| format, with a built-in code editor and interpreter [1].
|
| I think today, you can use Racket in its special SICP mode to get
| a much better experience. But maybe the HTML (Bootstrap)
| formatting is a little nicer to read (and with the bonus that it
| probably works on phones).
|
| The interpreter was incomplete and written from scratch, as a
| learning project [2]. This was done in the pre-WebAssembly days,
| so I couldn't just recompile, say, a Scheme written in C for use
| in the browser.
|
| If I recall correctly, I took the SICP source files, ran a bunch
| of regular expressions on them to convert the content into XML
| [3], and then used XSLT to generate the web pages [1]. I was
| really into XSLT at the time :)
|
| Anyway, hope people find this useful! It's outdated and
| incomplete, and the interpreter has an odd implementation, but it
| was a fun project.
|
| Source code links:
|
| [1] HTML generator: https://github.com/jaredkrinke/learn-scheme
|
| [2] Interpreter: https://github.com/jaredkrinke/jslisp
|
| [3] SICP-to-XML converter: https://github.com/jaredkrinke/sicp-
| reformatter
| Zambyte wrote:
| > This was done in the pre-WebAssembly days, so I couldn't just
| recompile, say, a Scheme written in C for use in the browser.
|
| If this is a direction you (or anyone else!) would like to
| explore, GNU Guile has been having work done to port it to
| WebAssembly under the Hoot project[0].
|
| [0] https://gitlab.com/spritely/guile-hoot
| sitkack wrote:
| A cool hack was presented at the 13th Racket Con yesterday,
| showing how to run PB (the Chez Scheme bytecode interpreter)
| on Wasm.
|
| Racket with Wasm-PB Chunk,
| https://github.com/adamperlin/racket
|
| Videos should be posted here shortly,
| https://www.youtube.com/@racketlang/videos
|
| https://con.racket-lang.org/
| josh-sematic wrote:
| Yeah, I went through it this weekend because I was curious
| about Scheme, and was surprised when it ended so suddenly! It
| was a good read though. Any more advanced free online Scheme
| tutorials you can recommend? I'd like to get to continuations,
| lazy evaluations, macros etc..
| Jtsummers wrote:
| The linked site's text comes from this source material:
| https://mitp-content-
| server.mit.edu/books/content/sectbyfn/b...
|
| So you can continue to explore the rest of the book for free
| (without the aid of the built-in interactive interpreter).
| Check out Racket and its included support for the particular
| Scheme used by SICP: https://docs.racket-lang.org/sicp-
| manual/
| schemescape wrote:
| I switched over to Common Lisp, so I don't really have any
| personal recommendations for Scheme, but this site was useful
| for learning CL and it also has a section on Scheme:
| https://www.linuxlinks.com/excellent-free-books-learn-
| scheme...
| segh wrote:
| Here is another online SICP with built in interpreter.
|
| http://xuanji.appspot.com/isicp/
| schemescape wrote:
| That one seems better!
|
| Edit: wow, it even predates my attempt:
| https://news.ycombinator.com/item?id=4860370
| easytiger wrote:
| There are verbatim copies of SICP content in here. Is that
| legal?
| reikonomusha wrote:
| > Structure and Interpretation of Computer Programs by Harold
| Abelson and Gerald Jay Sussman with Julie Sussman is licensed
| under a Creative Commons Attribution-ShareAlike 4.0
| International License by the MIT Press.
|
| from https://mitp-content-
| server.mit.edu/books/content/sectbyfn/b...
| schemescape wrote:
| Yes, and I even confirmed it with MIT Press prior to
| publishing the project (many years ago):
|
| https://mitp-content-
| server.mit.edu/books/content/sectbyfn/b...
|
| > Structure and Interpretation of Computer Programs by Harold
| Abelson and Gerald Jay Sussman with Julie Sussman is licensed
| under a Creative Commons Attribution-ShareAlike 4.0
| International License by the MIT Press.
| DonHopkins wrote:
| >I was really into XSLT at the time :)
|
| We all have embarasing skeletons in our closets, and that's one
| of mine, too.
|
| https://news.ycombinator.com/item?id=33728303
|
| >My impression of XSLT is that there were representatives from
| every different programming language paradigm on the XSLT
| standard committee, and each one of them was able to get just
| enough of what was special about their own paradigm into the
| standard to showcase it while sabotaging the others and making
| them all look foolish, but not enough to actually get any work
| done or lord forbid synergistically dovetail together into a
| unified whole.
|
| >The only way I was ever able to get anything done with XLST
| was to use Microsoft's script extensions to drop down into
| JavaScript and just solve the problem with a few lines of code.
| And that begs the question of why am I not just solving this
| problem with a few lines of JavaScript code instead of inviting
| XSLT to the party?
| schemescape wrote:
| I can't decide if I liked XSLT or just the out-of-the-box
| thinking its convoluted solutions demanded.
|
| XPath was a joy to use, and I thought XHTML made more sense
| than HTML. But I was naive to think the "more logical"
| technology would take over!
| jrumbut wrote:
| There is a unique satisfaction to solving a problem with
| XSLT.
|
| That said, it's a lot like that old joke about regular
| expressions, "now you have two problems."
| shortrounddev2 wrote:
| Did you know SICP is in Javascript now?
| mark_l_watson wrote:
| Still a nice interactive web site!! I did something similar
| when applets were added to Java 1.0 beta, so many years ago. I
| had an AI tutorial powered by applets.
|
| You mentioned Racket. Were you at Racket Con this weekend? I
| attended remotely, and really enjoyed it.
|
| Pardon the self-promotion, but speaking of Scheme/Racket you
| can read my newly released (last Friday) book "Practical
| Artificial Intelligence Development With Racket - Using Racket
| Scheme for implementing many short AI examples including LLMs,
| vector datastore, NLP, semantic web and non-AI utilities" for
| free online. [1]
|
| [1] https://leanpub.com/racket-ai/read
|
| EDIT: my book is only 80% done. Example programs:
| https://github.com/mark-watson/Racket-AI-book-code
| DonHopkins wrote:
| Here's Kent Pittman's :TEACH;LISP from ITS, which is a MACLISP
| program that teaches you how to program in MACLISP. (That's "Man
| And Computer Lisp" from "Project MAC", not "Macintosh Lisp".)
|
| https://github.com/PDP-10/its/tree/master/src/teach
|
| https://en.wikipedia.org/wiki/Incompatible_Timesharing_Syste...
|
| https://en.wikipedia.org/wiki/Maclisp
|
| https://en.wikipedia.org/wiki/MIT_Computer_Science_and_Artif...
|
| Scheme or Lisp? Kent M Pitman explains the deep philosophical
| differences:
|
| https://www.reddit.com/r/programming/comments/6fa5r/scheme_o...
|
| https://groups.google.com/g/comp.lang.lisp/c/TEk4O4-zsA8/m/H...
|
| >You should definitely learn both if you can afford the time.
| They are not redundant with one another, in spite of their
| superficial syntactic similarity.
|
| >Others divide up this space differently than I, but for most
| purposes, I personally regard them as distinct langauges, not
| mere dialectal variations, although plainly they are from what I
| would call the same language family.
|
| >You will probably prefer to use one or the other in the end, but
| they each have things to teach you. Even if you prefer to use
| neither, you will use the things you learn from these languages
| in your future thinking, becuase they will give you metaphors for
| thinking about things that other languages do not.
|
| This is like catnip for people interested in the sociological and
| cultural aspects of programming language design:
|
| Common Lisp: The Untold Story; Kent M. Pitman, HyperMeta Inc.
|
| https://www.nhplace.com/kent/Papers/cl-untold-story.html
|
| Here's a description of :TEACH;LISP that I posted to reddit 11
| years ago:
|
| https://www.reddit.com/r/programming/comments/t4rre/comment/...
|
| >xardox 11 yr. ago
|
| >Kent Pitman's a great guy who's done a lot of pioneering work to
| teach people Lisp.
|
| >KMP wrote a Lisp program to teach MACLISP on the MIT AI Lab's
| ITS systems called ":TEACH;LISP", which I used to learn Lisp (but
| which Jerry Pournelle cited in a not-friendly light).
|
| >KMP kindly took the time to personally teach me some LISP, by
| challenging me to a dual! We both ran our own LISP processes, and
| loaded a function called EVAL-IN-OTHER-LISP that used "core link
| interrupts" to send s-expressions from one LISP to another, so we
| could evaluate code in each other's LISP. That made it easy for
| him to define and call functions in my LISP, which was quite fun,
| but then he set my numeric output base to roman numerals! He won
| that dual.
|
| Core Link Interrupts (ITS's interprocess communication mechanism,
| sending messages through actual core memory on a PDP-10):
|
| https://web.archive.org/web/20110904184550/http://www.avanth...
|
| How Jerry Pournelle got kicked off the ARPANET:
|
| http://www.art.net/~hopkins/Don/text/pourne-smut.html
|
| >From: Kent M Pitman <KMP at SCRC-STONY-BROOK.ARPA>
|
| >Subject: Pourne
|
| >Personally, I'd just turn off his account. It's not like it's
| the first time, and he not only flaunts his use of our machines
| but stabs us in the back with grumblings about why he doesn't
| like this or that program of ours when he gets a chance. (Am
| thinking particularly of an article he wrote which condemned Lisp
| for reasons amounting to little more than his ignorance, but
| which cited Teach-Lisp in a not-friendly light... The man has
| learned nothing from his presence on MC and sets a bad example of
| what people might potentially accomplish there. I'd rather
| recycle his account for some bright 12-yr-old...)
|
| Here's the source code to EVAL-IN-OTHER-LISP:
|
| https://www.maclisp.info/pitmanual/system.html
| The following is some sample code (complete with documentation)
| that I found in my notes and thought might be helpful:
| ;;; Notes about CLI interrupts: ;;; ;;; A CLI
| interrupt is what happens when another job sends to yours. It is
| ;;; normally the case that other jobs will send directly to a
| user's HACTRN. ;;; If, however, Lisp is interrupted by a
| CLI message, it can elect to handle ;;; handle the
| interrupt in an arbitrary way. ;;; ;;; To define
| a handler, two things must be done: ;;; [1] Place the
| name of the handler function (function of one arg) ;;;
| in the variable CLI-MESSAGE. ;;; [2] Enable CLI handling
| with (SSTATUS CLI T) ;;; ;;; The handler should
| take a single argument which it probably should ignore
| ;;; since I have no idea what it is likely to be. ;;;
| ;;; The handler should open the file "CLA:" in (CLA BLOCK) mode
| and immediately ;;; discard the first 8 characters which
| will be garbage. ;;; ;;; The remainder of the
| stream, until a control-C or an eof, will be the text ;;;
| of the message sent. It may be read with TYI, READ, etc. and
| handled ;;; however. (eval-when (eval
| compile) (cond ((not (get 'iota 'version))
| (load "liblsp;iota")))) (defun handle-cli-msg
| (ignore) (iota ((stream '((cla)) '(cla block)))
| (do ((i 0 (1+ i))) ((= i 8)) (tyi stream)) (do ((c
| (tyi stream -1) (tyi stream -1))) ((or (= c -1)
| (= c 3))) (format t "~&~3,'0O ~@:C~%" c c))))
| ;print out chars seen (setq cli-message 'handle-cli-
| msg) (sstatus cli t) ; --------
| (defun eval-cli-msg (ignore) ;alternate handler (iota
| ((stream '((cla)) '(block cla))) (do ((i 0 (1+ i)))
| ((= i 8)) (tyi stream)) (do ((f (read stream nil)
| (read stream nil))) ((null f))
| (errset (eval f) nil)))) ;Quietly evaluate forms...
| ;; Assumes the other lisp will have EVAL-CLI-MSG as value of CLI-
| MESSAGE (defun eval-in-other-lisp (uname jname
| s-expression) (iota ((stream `((cli) ,uname ,jname)
| '(out ascii block))) (print s-expression stream)))
___________________________________________________________________
(page generated 2023-10-29 23:00 UTC)