[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)