[HN Gopher] MIT 6.001 Structure and Interpretation (1986) [video]
       ___________________________________________________________________
        
       MIT 6.001 Structure and Interpretation (1986) [video]
        
       Author : rsapkf
       Score  : 201 points
       Date   : 2020-06-22 12:03 UTC (10 hours ago)
        
 (HTM) web link (www.youtube.com)
 (TXT) w3m dump (www.youtube.com)
        
       | markus_zhang wrote:
       | As someone who actually ditched the Scheme version and went for
       | and completed the Python one (and Python version is way easier),
       | I'm actually disappointed to see that MIT dropped the Scheme
       | version 15 years ago.
       | 
       | I mean it's MIT, and MIT is supposed to have the sharpest minds
       | and the most difficult courses. And the Scheme version, albeit
       | that I dropped it due to difficulty, DOES have a certain "flavor"
       | that I did enjoy. Can't say what it is though.
        
         | akulkarni wrote:
         | I agree. I remember back then hating that 6.001 wasn't taught
         | in a "practical" programming language, but now I completely see
         | the value (and perhaps also magical aura!) of Scheme.
        
         | tartoran wrote:
         | Perhaps simplicity? I find that Scheme makes it very easy to
         | see the bare patterns
        
           | markus_zhang wrote:
           | I think it's the way it teaches you to build things from
           | ground-up and forces you to understand the principles. I'm
           | reading CSAPP 3rd chapter and it gives me the same feeling.
        
             | bitwize wrote:
             | That's exactly why 6.001 was dropped. There is no building
             | from the ground up anymore; virtually all software
             | development is modifying or extending something that
             | already exists to fit some application.
        
               | markus_zhang wrote:
               | I guess it's reasonable, but as a hobbyist I have the
               | advantage to ignore such constraints (to seek a job), and
               | such courses/books do seem to be attractive.
        
         | greenshackle2 wrote:
         | How did they do the metacircular evaluator parts of the book in
         | Python? That is one of the parts where the homoiconicity of
         | Scheme really shines. Python just doesn't have that.
        
       | danielam wrote:
       | N.b. should read "Structure and Interpretation".
        
         | dang wrote:
         | Fixed now. Thanks!
        
       | pieterk wrote:
       | Having had formal education at a Java college, where you had to
       | have at least one Class definition to run your code, discovering
       | this course was a revelation.
       | 
       | To learn from the people that invented their own programming
       | language AND chip to go with it. For free, as long as you had
       | internet access, is something I'm eternally thankful for.
       | 
       | This video series is a national treasure. It changed my life, and
       | so many others, without a doubt, for the uncountable better.
       | 
       | (THANK YOU)
        
         | DonHopkins wrote:
         | Here's some info (and links to pictures) I posted earlier about
         | Lynn Conway's groundbreaking 1978 MIT VLSI System Design
         | Course, in which Guy Steele designed his Lisp Microprocessor:
         | 
         | https://news.ycombinator.com/item?id=8860722
         | 
         | I believe this is about the Lisp Microprocessor that Guy Steele
         | created in Lynn Conway's groundbreaking 1978 MIT VLSI System
         | Design Course:
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MIT78/MIT78.html
         | 
         | My friend David Levitt is crouching down in this class photo so
         | his big 1978 hair doesn't block Guy Steele's face:
         | 
         | The class photo is in two parts, left and right:
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MIT78/Class2s.jp...
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MIT78/Class3s.jp...
         | 
         | Here are hires images of the two halves of the chip the class
         | made:
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/InstGuide/MIT78c...
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/InstGuide/MIT78c...
         | 
         | The Great Quux's Lisp Microprocessor is the big one on the left
         | of the second image, and you can see his name "(C) 1978 GUY L
         | STEELE JR" if you zoom in. David's project is in the lower
         | right corner of the first image, and you can see his name
         | "LEVITT" if you zoom way in.
         | 
         | Here is a photo of a chalkboard with status of the various
         | projects:
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MIT78/Status%20E...
         | 
         | The final sanity check before maskmaking: A wall-sized overall
         | check plot made at Xerox PARC from Arpanet-transmitted design
         | files, showing the student design projects merged into
         | multiproject chip set.
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MIT78/Checkplot%...
         | 
         | One of the wafers just off the HP fab line containing the
         | MIT'78 VLSI design projects: Wafers were then diced into chips,
         | and the chips packaged and wire bonded to specific projects,
         | which were then tested back at M.I.T.
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MIT78/Wafer%20s....
         | 
         | Design of a LISP-based microprocessor
         | 
         | http://dl.acm.org/citation.cfm?id=359031
         | 
         | ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-514.pdf
         | 
         | Page 22 has a map of the processor layout:
         | 
         | http://i.imgur.com/zwaJMQC.jpg
         | 
         | We present a design for a class of computers whose "instruction
         | sets" are based on LISP. LISP, like traditional stored-program
         | machine languages and unlike most high-level languages,
         | conceptually stores programs and data in the same way and
         | explicitly allows programs to be manipulated as data, and so is
         | a suitable basis for a stored-program computer architecture.
         | LISP differs from traditional machine languages in that the
         | program/data storage is conceptually an unordered set of linked
         | record structures of various sizes, rather than an ordered,
         | indexable vector of integers or bit fields of fixed size. An
         | instruction set can be designed for programs expressed as trees
         | of record structures. A processor can interpret these program
         | trees in a recursive fashion and provide automatic storage
         | management for the record structures. We discuss a small-scale
         | prototype VLSI microprocessor which has been designed and
         | fabricated, containing a sufficiently complete instruction
         | interpreter to execute small programs and a rudimentary storage
         | allocator.
         | 
         | Here's a map of the projects on that chip, and a list of the
         | people who made them and what they did:
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MIT78/MPC78map.g...
         | 
         | 1. Sandra Azoury, N. Lynn Bowen Jorge Rubenstein: Charge flow
         | transistors (moisture sensors) integrated into digital
         | subsystem for testing.
         | 
         | 2. Andy Boughton, J. Dean Brock, Randy Bryant, Clement Leung:
         | Serial data manipulator subsystem for searching and sorting
         | data base operations.
         | 
         | 3. Jim Cherry: Graphics memory subsystem for mirroring/rotating
         | image data.
         | 
         | 4. Mike Coln: Switched capacitor, serial quantizing D/A
         | converter.
         | 
         | 5. Steve Frank: Writeable PLA project, based on the
         | 3-transistor ram cell.
         | 
         | 6. Jim Frankel: Data path portion of a bit-slice
         | microprocessor.
         | 
         | 7. Nelson Goldikener, Scott Westbrook: Electrical test patterns
         | for chip set.
         | 
         | 8. Tak Hiratsuka: Subsystem for data base operations.
         | 
         | 9. Siu Ho Lam: Autocorrelator subsystem.
         | 
         | 10. Dave Levitt: Synchronously timed FIFO.
         | 
         | 11. Craig Olson: Bus interface for 7-segment display data.
         | 
         | 12. Dave Otten: Bus interfaceable real time clock/calendar.
         | 
         | 13. Ernesto Perea: 4-Bit slice microprogram sequencer.
         | 
         | 14. Gerald Roylance: LRU virtual memory paging subsystem.
         | 
         | 15. Dave Shaver Multi-function smart memory.
         | 
         | 16. Alan Snyder Associative memory.
         | 
         | 17. Guy Steele: LISP microprocessor (LISP expression evaluator
         | and associated memory manager; operates directly on LISP
         | expressions stored in memory).
         | 
         | 18. Richard Stern: Finite impulse response digital filter.
         | 
         | 19. Runchan Yang: Armstrong type bubble sorting memory.
         | 
         | The following projects were completed but not quite in time for
         | inclusion in the project set:
         | 
         | 20. Sandra Azoury, N. Lynn Bowen, Jorge Rubenstein: In addition
         | to project 1 above, this team completed a CRT controller
         | project.
         | 
         | 21. Martin Fraeman: Programmable interval clock.
         | 
         | 22. Bob Baldwin: LCS net nametable project.
         | 
         | 23. Moshe Bain: Programmable word generator.
         | 
         | 24. Rae McLellan: Chaos net address matcher.
         | 
         | 25. Robert Reynolds: Digital Subsystem to be used with project
         | 4.
         | 
         | Also, Jim Clark (SGI, Netscape) was one of Lynn Conway's
         | students, and she taught him how to make his first prototype
         | "Geometry Engine"!
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MPCAdv/MPCAdv.ht...
         | 
         | Just 29 days after the design deadline time at the end of the
         | courses, packaged custom wire-bonded chips were shipped back to
         | all the MPC79 designers. Many of these worked as planned, and
         | the overall activity was a great success. I'll now project
         | photos of several interesting MPC79 projects. First is one of
         | the multiproject chips produced by students and faculty
         | researchers at Stanford University (Fig. 5). Among these is the
         | first prototype of the "Geometry Engine", a high performance
         | computer graphics image-generation system, designed by Jim
         | Clark. That project has since evolved into a very interesting
         | architectural exploration and development project.[9]
         | 
         | Figure 5. Photo of MPC79 Die-Type BK (containing projects from
         | Stanford University):
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MPCAdv/SU-BK1.jp...
         | 
         | [...]
         | 
         | The text itself passed through drafts, became a manuscript,
         | went on to become a published text. Design environments evolved
         | from primitive CIF editors and CIF plotting software on to
         | include all sorts of advanced symbolic layout generators and
         | analysis aids. Some new architectural paradigms have begun to
         | similarly evolve. An example is the series of designs produced
         | by the OM project here at Caltech. At MIT there has been the
         | work on evolving the LISP microprocessors [3,10]. At Stanford,
         | Jim Clark's prototype geometry engine, done as a project for
         | MPC79, has gone on to become the basis of a very powerful
         | graphics processing system architecture [9], involving a later
         | iteration of his prototype plus new work by Marc Hannah on an
         | image memory processor [20].
         | 
         | [...]
         | 
         | For example, the early circuit extractor work done by Clark
         | Baker [16] at MIT became very widely known because Clark made
         | access to the program available to a number of people in the
         | network community. From Clark's viewpoint, this further tested
         | the program and validated the concepts involved. But Clark's
         | use of the network made many, many people aware of what the
         | concept was about. The extractor proved so useful that
         | knowledge about it propagated very rapidly through the
         | community. (Another factor may have been the clever and often
         | bizarre error-messages that Clark's program generated when it
         | found an error in a user's design!)
         | 
         | 9. J. Clark, "A VLSI Geometry Processor for Graphics",
         | Computer, Vol. 13, No. 7, July, 1980.
         | 
         | [...]
         | 
         | The above is all from Lynn Conway's fascinating web site, which
         | includes her great book "VLSI Reminiscence" available for free:
         | 
         | http://ai.eecs.umich.edu/people/conway/
         | 
         | These photos look very beautiful to me, and it's interesting to
         | scroll around the hires image of the Quux's Lisp Microprocessor
         | while looking at the map from page 22 that I linked to above.
         | There really isn't that much too it, so even though it's the
         | biggest one, it really isn't all that complicated, so I'd say
         | that "SIMPLE" graffiti is not totally inappropriate. (It's
         | microcoded, and you can actually see the rough but semi-regular
         | "texture" of the code!)
         | 
         | This paper has lots more beautiful Vintage VLSI Porn, if you're
         | into that kind of stuff like I am:
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/MPC79/Photos/PDF...
         | 
         | A full color hires image of the chip including James Clark's
         | Geometry Engine is on page 23, model "MPC79BK", upside down in
         | the upper right corner, "Geometry Engine (C) 1979 James Clark",
         | with a close-up "centerfold spread" on page 27.
         | 
         | Is the "document chip" on page 20, model "MPC79AH", a hardware
         | implementation of Literate Programming?
         | 
         | If somebody catches you looking at page 27, you can quickly
         | flip to page 20, and tell them that you only look at Vintage
         | VLSI Porn Magazines for the articles!
         | 
         | There is quite literally a Playboy Bunny logo on page 21, model
         | "MPC79B1", so who knows what else you might find in there by
         | zooming in and scrolling around stuff like the "infamous
         | buffalo chip"?
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/VLSIarchive.html
         | 
         | http://ai.eecs.umich.edu/people/conway/VLSI/VLSI.archive.spr...
        
           | bitwize wrote:
           | It's worth noting that the Lisp Microprocessor was something
           | quite different from Lisp Machines. Lisp Machines like the
           | CADR and the Symbolics 3600 had conventional CPUs with
           | enhancements like support for parallel tagbit and bounds
           | checking and hardware acceleration of GC to make Lisp
           | programs run faster. For the Lisp Microprocessor, a
           | representation of Lisp _was_ the instruction set.
        
       | bigasscoffee wrote:
       | I've watched this before. It would have been so great to be in
       | some of these classes and a Course 6 student there!
        
       | yagodragon wrote:
       | I'm studying CS but haven't heard any concrete examples of why I
       | should learn a lisp (scheme, Clojure). Every time I ask i get
       | pseudo-intellectual answers of how it will expand my mind, make
       | it easier to express complex human problems/domains into code or
       | even make me re-evaluate things in life on a philosophical level.
       | What? On the one hand, i'm sooo curious to study all of this and
       | see for myself, but on the other hand, life's too short and I'm
       | already spending so much time in front of a PC to get my degree,
       | learn a couple of more languages, make side projects on github,
       | personal blogs etc to make myself more employable.
       | 
       | Anyway, i know this is HN i'm asking, but can you give me at
       | least one compelling reason why I should study lisp,scheme or
       | clojure ?
        
         | tzone wrote:
         | I think you can spend your time learning much more useful
         | things in Software Engineering than learning Lisp or Scheme.
         | 
         | Examples:
         | 
         | * Learn about type systems: advantages and disadvantages of
         | various modern (or older) type systems: c++, java, typescript,
         | rust, go, etc... Understanding pros and cons of various type
         | systems would help you improve as a software engineer, and make
         | you better at designing proper abstractions and apis in
         | whatever language you are working in.
         | 
         | * Learn about concurrency primitives, asynchronous event loops,
         | parallel programming, etc. In modern software engineering
         | pretty much every type of work involves concurrency,
         | understanding what type of primitives exist in different
         | platforms and languages, and what are their pros and cons would
         | make you much more effective as a software engineer overall.
         | 
         | * Learn about data structures in scope of data storage and data
         | transfer in practice. Get understanding of network i/o, disk
         | i/o, how things get stored in memory, how things get stored
         | persistently. This stuff is way more complex and way more
         | useful in practice than learning about slightly different ways
         | of doing computation or calling functions in a programming
         | language.
         | 
         | * and many more...
         | 
         | I would say in modern software engineering, part of "how to
         | express basic computation" is really the least complex and
         | least interesting of the bunch. You can skin that cat many ways
         | but compared to many other challenges, it is in my opinion at
         | the way bottom in terms of importance.
        
         | martincmartin wrote:
         | Lisps have a uniform syntax in S-expressions. This makes it
         | unfamiliar to new users, but it means syntax just melts away,
         | and you're expressing the abstract syntax tree of your program
         | directly.
         | 
         | So writing code to manipulate abstract syntax trees becomes
         | easy, since you're using to writing & thinking about programs
         | in that form, and it's just manipulating lists, which is easy.
         | For example, it becomes easy to write a program to symbolically
         | differentiate an input expression.
         | 
         | You also think about functions as something easy and natural to
         | pass around.
         | 
         | They also encourage pure functions, which allow lazy
         | evaluation, easy memoization, and other fun things.
        
         | bitwize wrote:
         | > I'm studying CS but haven't heard any concrete examples of
         | why I should learn a lisp (scheme, Clojure). Every time I ask i
         | get pseudo-intellectual answers of how it will expand my mind,
         | make it easier to express complex human problems/domains into
         | code or even make me re-evaluate things in life on a
         | philosophical level. What?
         | 
         | Lisp is very close to the Tao, and the Tao that can be spoken
         | of is not the true Tao. That's why no one can tell you in
         | concrete terms the greatest benefits of Lisp's eldritch power,
         | and they all end up in spirals of circumlocution about "lack of
         | syntax" or "homoiconicity" or somesuch. You have to experience
         | it for yourself before you "get it".
         | 
         | The fact that McCarthy devised (or discovered) a powerful,
         | high-level language with an extensible, morphable syntax that's
         | definable in terms of itself in seven functions (and those
         | functions were themselves readily convertible by hand to
         | machine code) should be a massive clue, though.
         | 
         | > but on the other hand, life's too short and I'm already
         | spending so much time in front of a PC to get my degree, learn
         | a couple of more languages, make side projects on github,
         | personal blogs etc to make myself more employable.
         | 
         | That's part of your problem. You are too busy chasing good-boy
         | points from the job market to really sit down and _study_ this
         | stuff. My suggestion is to focus on your collegiate studies for
         | now. If you have time, study an additional language /CS topic
         | or two, but only stuff you can get really interested or
         | engrossed in. There's a good chance that eventually, Lisp will
         | call to you. It's one of those ideas in CS that are so
         | profoundly good that if you are interested in CS, you will be
         | interested in Lisp, at least the history of Lisp and what it
         | brought to the table.
         | 
         | If you are just looking for practical reasons to learn a
         | language that translate directly to resume padding and more
         | zeros on your starting salary, then JavaScript is an acceptable
         | Lisp and you may as well stick with something like that.
        
         | bonoboTP wrote:
         | Don't overthink it. You've clearly come across Lisp and
         | wondered about it enough to read up on people's opinions and to
         | post a comment. That's reason enough.
         | 
         | I'd encourage you just go and try it out. Spend an evening or a
         | Saturday reading a book / working through a tutorial to see for
         | yourself. You cannot lose anything. At worst, you find out you
         | don't like it, but at least you will have some first-hand
         | opinion and an idea of what everyone is talking about.
         | 
         | Good approach for all those things you've always been
         | hearing/wondering about but never tipped in your toes.
        
         | qntty wrote:
         | I didn't read through the entirety of SICP, but I read through
         | the first ~3 chapters, and it helped me to understand the way
         | that functions are associated with the environment that they
         | are defined in and how this fact can be used to construct
         | closures. I haven't seen as good of a description of this up
         | until that point.
        
         | babarock wrote:
         | First of all, I want to mention that SICP is _so much more_
         | than learning lisp. As a matter of fact, learning lisp only
         | takes 10 minutes in the first lecture. The rest of the course
         | is about learning programming techniques (and _magic_ as they
         | call it) with the explicit intent of learning to _manage
         | complexity_. Even if you 're completely fluent in lisp, taking
         | this class will be massively mind opening.
         | 
         | With this out of the way, what's so special about lisp? Where
         | did it get this reputation for mind-expansion? Part of it is
         | historical. 20-30 years ago, the industry was focused around
         | _stricter_ (for lack of a better term) languages like C++ or
         | Java, and lisp presented some features that were super
         | powerful, like REPL, interactive debuggers, higher order
         | functions, lexical scoping, lambdas, etc. Lots of mainstream
         | languages have since adopted these features (python, perl,
         | ruby, javascript, ...), making lisp a bit less _exotic_ than it
         | used to be.
         | 
         | Still, today, there're some things that are unique to lisp that
         | might be worth studying. The most important thing is _macros_.
         | Macros are only possible because of the (lack of) syntax of
         | lisp. It 's a programming technique that consists of
         | _programming your compiler_, for lack of a better term. It
         | allows you to define a language specific to the domain you're
         | working on. Pretty unique technique, and like all the other
         | techniques, sometimes smart, sometimes useless, sometimes
         | abused. I still believe it's worth learning, because
         | understanding how macros work will explain a lot of things
         | about the other tools you're using as a programmer.
         | 
         | I hope this makes things a bit clearer.
         | 
         | TLDR: A lot of what made lisp special is now available in other
         | languages. Learning lisp is still worth it to expose you to
         | _macros_. Regardless of how well you know lisp, going through
         | SICP will be massively beneficial.
        
           | infinite8s wrote:
           | You do realize that LISP is older than both C++ and Java (by
           | at least a few decades) :)
        
         | bhntr3 wrote:
         | I don't think you really need to "learn a lisp" but I recommend
         | that curious developers read SICP at some point.
         | 
         | John McCarthy famously wrote a lisp interpreter in a half page
         | of lisp in the lisp 1.5 manual. The simplicity of the
         | interpreter makes it possible for SICP to really focus in on
         | the essence of what programming languages are and how features
         | can be incrementally added. Imagine trying to learn programming
         | by building a java compiler. Lisp is a much simpler language
         | for learning how languages work.
         | 
         | The lisp interpreter is so simple because the code of lisp is
         | written in the data structures of the languages: a bunch of
         | nested lists. So the parsed syntax tree is very similar to the
         | code. This means that meta-programming on it is much easier to
         | reason about. You can write macros in other languages to change
         | the functioning of the language itself but it's much more
         | complicated for complex syntax. This makes lisps languages for
         | creating your own language. Some people probably love lisp
         | because they're inspired by it but people who consider its
         | power indispensable (pg) probably customize it a lot with
         | macros.
         | 
         | Someday you may find yourself implementing a lisp
         | unintentionally
         | (https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule) . IMO
         | this is because it's natural to start with some text based data
         | structure format (JSON?) for some config file or something and
         | then add features incrementally. Suddenly you're making a lisp.
         | Understanding lisp can help you realize you're building a bad
         | one. This has happened to me before.
         | 
         | Lisp is also very interesting if you want to write code that
         | writes itself. For instance, if you were toying with genetic
         | algorithms the fact that every piece of lisp code within
         | matched parens is itself a valid lisp program is a nice feature
         | to have.
         | 
         | In the end though, I don't think actually using lisp is as
         | important as understanding lisp. I can see the insane power of
         | meta-programming for creating higher abstractions for myself or
         | a small team of like minded individuals. But whether it's lisp
         | macros, scala implicits, annotation based byte code rewriting
         | in java or method_missing in ruby, I think that meta-
         | programming becomes a form of obfuscation for really large
         | teams. If you take away meta-programming from lisp you still
         | have some really cool languages. But I think many of those cool
         | things about lisp can be achieved in more mainstream languages
         | if you understand what you're trying to achieve.
         | 
         | After all, Brendan Eich was inspired by scheme when he created
         | Javascript in ten days. But he was told to make the syntax
         | "like Java". That's a bit ironic given that Guy Steele (one of
         | the creators of Scheme) helped write the original Java
         | specification. Neither language is very scheme-like in the end.
         | But both authors contend that the languages would have been a
         | lot worse if they hadn't been around to put a bit of lispiness
         | into them.
         | 
         | So the last reason to learn lisp is that if you ever get asked
         | to make a programming language for a large company with lots of
         | stupid restrictions in a very short time frame you might be
         | able to inject enough lisp into it that people will still use
         | it under duress 25-30 years later.
        
           | jecel wrote:
           | > That's a bit ironic given that Guy Steele (one of the
           | creators of Scheme) helped write the original Java
           | specification.
           | 
           | Note that "write the specification" in this context meant
           | creating a text to describe a design that had been done by
           | other people before he joined. Guy made it quite clear at
           | OOPSLA 2003 (which had become essentially a Java conference)
           | that the language would have been different if he had been
           | able to have any input.
        
         | Jtsummers wrote:
         | http://minikanren.org
         | 
         | I was trying to come up with examples to demonstrate the value
         | of lisp in my own work, but I think this one captures it
         | better. Imagine being able to use your language to create a
         | language, that still interacts with everything else, and
         | express it so clearly that people can translate that into
         | dozens of other languages.
         | 
         | If you were to write that initially in Java or C or something
         | it would be hard to separate the essential complexity (the
         | problem of solving relational problems) from the accidental
         | complexity (managing the underlying language's semantics and
         | data structures and such) while keeping the entire code base
         | clean and clear.
         | 
         | Lisps do a better job of eliminating or reducing accidental
         | complexity compared to many mainstream languages, especially
         | the enterprise-y ones like Java and C#, which are commonly used
         | in CS education unless you're at a unique school or one of the
         | top schools in the US (without experience, I can't comment on
         | what non-US schools teach).
        
         | cellularmitosis wrote:
         | I think the primary thing which differentiates SICP's approach
         | in particular is the wishful-thinking-driven-development, or
         | "top-down development". You start at the top-level function,
         | and write it completely, calling functions which you have named
         | but haven't written yet. Then implement those, and so on. Yes,
         | this is possible in other dyn langs as well, but SICP really
         | emphasizes this approach.
         | 
         | One of the most interesting bits which differentiates lisps in
         | general are macros. This gives you a lot of power over the
         | language. You aren't stuck waiting on the language designers to
         | give you new language-level features -- you can write them
         | yourself!
         | 
         | The first example which comes to mind is asynchronous
         | programming. In Clojure, core.async is a _library_ , not a
         | language-level feature! Stop and really think about that.
         | 
         | Also illustrative is to download the Clojure source and 'grep
         | -r defmacro src/' and look through the results. A lot of what
         | would be keywords in other languages are simply macros in a
         | lisp. That means you could have written them yourself!!! The
         | "threading macro" ('->' and '->>') is the one I like to point
         | to. Any user could have come up with that!
         | 
         | This is like being able to add list comprehensions to the
         | Python language, but as a _user_!
         | 
         | (disclaimer: I haven't written Clojure in anger, yet!)
        
           | njharman wrote:
           | > could have written yourself
           | 
           | This. Is a divide between programmers. Some are thrilled by
           | this. Others, like me, see the power and flexibilty and front
           | disagree it can be good. But their day to day problems are
           | not lacking the most expressive, efficient Lang. Its
           | communication, process, deadlines, change, domain knowledge,
           | etc.
           | 
           | I didn't and don't want to invest my limited mental power in
           | learning and keeping up with all about compiler Lang design
           | CS theory. I want to use a language people much smarter and
           | experienced with compiler and language design and theory have
           | made for me. I want to build a program using the domain
           | specific knowledge I've invested in. Not build program to
           | write other programs..
        
         | pjmorris wrote:
         | Lisps capture something fundamental about computation more
         | cleanly than other languages. In Alan Kay's words,
         | 
         | "Yes, that was the big revelation to me when I was in graduate
         | school--when I finally understood that the half page of code on
         | the bottom of page 13 of the Lisp 1.5 manual was Lisp in
         | itself. These were "Maxwell's Equations of Software!" - lifted
         | from [0]
         | 
         | [0] http://www.righto.com/2008/07/maxwells-equations-of-
         | software...
        
         | mamcx wrote:
         | I don't like lisp, not code in lisp; not even a line.. and I
         | have read TONS of lisp stuff.
         | 
         | Why?
         | 
         | The #1 reason: The lisp people have a lot of cool things to
         | teach.
         | 
         | One of the most obvious examples:
         | 
         | https://www.infoq.com/presentations/Simple-Made-Easy/
         | 
         | So, you can learn _enough_ of Lisp or APL or oCalm or Haskell
         | to tag along with somebody smart on the field (that use certain
         | lang, maybe for very good reasons, maybe is just what he like)
         | and understand stuff.
         | 
         | Most of the real gems are kind of easy to learn with the most
         | basic understanding of a language.
         | 
         | ---
         | 
         | A lot of times, is THAT kind of people that have the better
         | insights of why certain lang matter.
         | 
         | Continue with the example of Rich Hickey:
         | 
         | https://dl.acm.org/doi/abs/10.1145/3386321
         | 
         | ---
         | 
         | You can translate a lot of ideas from a lang to other, as the
         | most basic and simply benefits.
         | 
         | Is just the case that certain langs fit the minds/goals/niches
         | better, so is there where to look for better answers...
        
         | nightski wrote:
         | If you need someone online to justify for you learning new
         | things in your field you have probably already lost. This field
         | is unrelenting, it requires constant learning. I'm nearing 40
         | and it hasn't stopped. The one advantage is the more you learn
         | the more skills transfer from one thing to the next.
         | 
         | So the most compelling reason I have is because learning new
         | things should be something that you find exciting. What makes
         | Lisp unique is that it is a lot different than other languages
         | out there. If you know one imperative language, learning
         | another may expand your horizons but not in the same way
         | something from a different paradigm would.
         | 
         | If you already know a functional language or two, then it might
         | not be worthwhile. That is very much up to you. But even though
         | I have never used Lisp I enjoyed learning it immensely.
         | Although I'd say I enjoyed Haskell more.
         | 
         | I will say back in the day I watched these lectures and found
         | them incredibly satisfying and thought provoking.
        
           | bigfoot675 wrote:
           | > If you need someone online to justify for you learning new
           | things in your field you have probably already lost.
           | 
           | You can't learn everything though. You absolutely should
           | contemplate whether something is worth learning before
           | embarking on that process -- otherwise you fill your head
           | with useless new things.
           | 
           | Nobody is saying that I need to learn COBOL to stay relevant
           | in the job market today, even if that would be a new language
           | for me.
        
           | seneca wrote:
           | > If you need someone online to justify for you learning new
           | things in your field you have probably already lost.
           | 
           | This is really unhelpful gate keeping. You're respond to
           | someone who literally just said they spend excessive time
           | studying the field already.
        
             | dunefox wrote:
             | > This is really unhelpful gate keeping.
             | 
             | I don't think it is. If you don't have time to learn
             | interesting stuff because you "have to write blog articles
             | to make yourself more employable" then you will probably
             | lose motivation or interest in CS.
        
           | smcl wrote:
           | I think the point was that many people talk breathlessly
           | about Lisp but are often quite hand-wavey about specifics.
           | When this concern has come up before I've seen them dismissed
           | with comments along the lines of "if you have to ask you
           | won't get it" or "just read SICP".
           | 
           | I've written and read a bunch of lisp and I'm slowly working
           | my way through SICP at a leisurely pace, but I totally
           | understand what these OP means. Some talk about lisp as
           | something magical (it appears on xkcd as a sort of "god's
           | programming language" - https://xkcd.com/224) yet often seem
           | cagey about actually sharing exactly why they think so. A
           | great example of what I mean is this pretty famous essay by
           | pg: http://www.paulgraham.com/avg.html.
           | 
           | In fact he says "Lisp is so great not because of some magic
           | quality visible only to devotees, but because it is simply
           | the most powerful language available" - which seems to dispel
           | the "magic" bit ... but then throws out the tantalising "most
           | powerful language" without (in my opinion) giving a
           | compelling argument. He mentions how lisp macros are more
           | powerful than those in C and does say "Lisp code is made out
           | of Lisp data objects" and a few other bits and pieces about
           | how it was higher-level than other popular languages at the
           | time (the mid-1990s). It certainly made me curious to explore
           | the language, but definitely left me with unanswered
           | questions.
           | 
           | My opinion is that this phenomenon is a result of a number of
           | things, including:
           | 
           | 1. some people went through a transformative experience
           | through learning lisp, and are deliberately vague to entice
           | others into exploring it without ruining some of the fun of
           | self-discovery
           | 
           | 2. some people had the same, but think that it's enough to
           | declare these things and don't care if you believe them or
           | not
           | 
           | 3. some people parrot what they have read some smart folks
           | say and simply _can 't_ formulate a good explanation even if
           | they wanted to
        
             | yomly wrote:
             | SICP is hard but remarkably complete. If you are vaguely
             | familiar with the maths that is chosen as the domain then
             | you can mostly begin the course from scratch.
             | 
             | It starts with some really simple stuff like (+ 2 2)
             | 
             | Then introduces some concepts like recursion along the way.
             | Next you get data structures and recursive data structures
             | before they pull off the greatest recursive magic trick to
             | show that your code is data itself.
             | 
             | Along the way you get a pretty accessible intro to
             | functional programming without having to get bogged down in
             | types, proofs and monads because Scheme is actually
             | imperative.
             | 
             | With my teacher hat on, this is a masterwork for pulling
             | together so many concepts into one (relatively) tiny
             | standalone course.
             | 
             | With my student hat on it is profound on so many levels. I
             | learn something new each time, even if only to appreciate
             | names like Church and Curry being namedropped as bits of
             | history because I'm not thinking a million miles an hour to
             | process all the new information. The passion Sussman and
             | Abelson bring the the course is authentic, endearing and
             | unfakeable - you know they really felt it.
             | 
             | In terms of what you do day in day out, SICP would be my go
             | to for covering most the fundamentals of "computational
             | thinking". You learn how basic algorithms and space/time
             | complexity, recursion and iteration, functions and objects,
             | data structures and finally program language construction
             | (with some teeny peaks at the machine itself). And I was
             | able to learn all this without a computer - using just pen
             | and paper because Scheme is so simple. This freed me up
             | from the distraction of trying to make a computer do
             | something and actually using my mind to reason. As someone
             | who did not do a CS degree there are not many other
             | resources that are that high up for grounding you in all
             | those subjects to get you ready for the job or put you on
             | the path for further reading.
             | 
             | Homoiconicity itself is such a mind bendingly pleasing
             | thing to encounter the first time round, the only thing
             | that came close was the stack machine - presumably because
             | the list and the stack encapsulate something primitive to
             | computation and language.
             | 
             | I remember the first time the penny dropped when I realized
             | that the cons operator for a list was also the spread
             | operator for arguments in a function signature and thinking
             | whoaaaaa
        
               | smcl wrote:
               | I'm not having trouble with SICP and do not doubt it's
               | efficacy as a teaching tool. Take another look at my
               | comment - I'm saying people are often very vague when
               | describing why they find Lisp so mind expanding, and this
               | can be a real puzzler for the "uninitiated"
        
             | sjamaan wrote:
             | I suppose it's a bit of 1 or 2 or 3. But there's also the
             | issue that emergent properties which fall out of the
             | overall design are quite hard to explain, and even advanced
             | students of the subject don't fully grok yet.
             | 
             | For example, "code is data" is true in the most trivial
             | sense for machine code, yet having code as structured data
             | makes it much easier to manipulate. Having easy to
             | manipulate code gives you the power to manipulate code at
             | compile-time. Having code run at compile time inside the
             | compiler, which is also an interpreter _running the same
             | language that you are compiling_ is kind of magical and
             | mind-bending.
             | 
             | In fact, more recent research into this has gone down the
             | rabbit hole even deeper, and it turns out you can have an
             | entire tower of meta-levels (see for example
             | http://www.phyast.pitt.edu/~micheles/scheme/scheme22.html).
             | This is all continuing on the same basic ideas which were
             | present in early Lisps, just crystallized and refined
             | further and further.
             | 
             | Also, as research into macros has gone on over the years,
             | hygienic macros were discovered, which Rust has adopted as
             | well (and there are other languages which have them as an
             | add-on, like Sweet.js). Deeply understanding how this stuff
             | works gives you a better grip on the issues with macros in
             | older languages (notably C).
             | 
             | And that's just macros (and homoiconicity). There's also
             | lexical versus dynamic scoping. This is a lot less
             | "magical" now than it was 10 years ago, when almost no
             | mainstream language even had closures.
        
               | sjamaan wrote:
               | And, oh yeah, grokking continuations makes it a lot
               | clearer how generators, iterators, exceptions and
               | coroutines work. One concept which subsumes all the
               | others. And if you want to get into compiler
               | construction, understanding CPS conversion makes it much
               | easier to do code transformations.
               | 
               | There's just tons of research which went into Lisps,
               | because it's such a nice vehicle for language
               | experimentation. There's half a century of research going
               | into Lisps. Other languages haven't been around for that
               | long, so I suppose there's something to find in Lisp
               | history for everyone, but _it might not be the same
               | thing_ for everyone!
        
               | AnimalMuppet wrote:
               | Are Rust macros at all comparable to Lisp macros? Can you
               | re-write the syntax of Rust with Rust macros? Or are they
               | more like C/C++ macros?
        
               | steveklabnik wrote:
               | > Are Rust macros at all comparable to Lisp macros?
               | 
               | There are two major kinds of macros in Rust. One of them,
               | macro_rules, is vaguely similar to Lisp macros. It was
               | partially designed and implemented by some big Racket
               | fans, in my understanding.
               | 
               | > Can you re-write the syntax of Rust with Rust macros?
               | 
               | Within limits.
               | 
               | > Or are they more like C/C++ macros?
               | 
               | Neither kind of Rust macros are like C or C++'s macros.
        
         | Jach wrote:
         | > Anyway, i know this is HN i'm asking, but can you give me at
         | least one compelling reason why I should study lisp,scheme or
         | clojure ?
         | 
         | In Common Lisp:                   * (eql 'i 'I)         T
         | 
         | In Clojure:                   user=> (= '(lisp,scheme or
         | clojure ?) '(lisp, scheme, or clojure ?))         true
         | 
         | Downvotes accepted for the grammar snark, I only mean it as a
         | light ribbing (and casual warning that programmers looking at
         | resumes are often, probably unfairly, going to penalize such
         | mistakes more harshly than they reward complex side projects).
         | 
         | More seriously: do you like programming? And furthermore, are
         | you interested in studying programming itself, not (just)
         | programming as a means to other things? Are you perhaps
         | interested in studying CS itself, not just exam material of
         | whatever collection of courses that grants you a CS degree? If
         | no, then you probably won't be compelled by any one reason to
         | study anything beyond that which might let you get a well-
         | paying programming job (perhaps as a gateway to getting a
         | management job in tech), and lisp is not such a necessity.
         | Nothing wrong with that, but inspect your motives carefully and
         | plan accordingly. If yes to any of those, studying new
         | languages will be rewarding, and lisps have a lot to offer. For
         | instance, if you studied Common Lisp, you would have an
         | environment suitable for practical programming of applications
         | in any domain, you would not want for language features either
         | because Lisp supported them anywhere from recently to 50+ years
         | ago (realize it took until Java 8 for Java to get anonymous
         | functions, and even then you're better served by SICP to learn
         | tasteful application of programming with them, just as you're
         | better served by Clojure to learn tasteful application of
         | immutable data structures) or you can add them yourself without
         | awaiting a new version, you would have a language good for
         | researching CS topics such as new languages (and compilers),
         | data structures, garbage collectors, type systems, theorem
         | provers, AI, etc., and you might save future-you some hours or
         | anxiety when it comes to "unrelenting, constant learning"
         | because you can frame this week's fad into concepts you already
         | know from Lisp.
         | 
         | Maybe the most compelling reason to study though is that of
         | there not being a better time. If you are so curious, just go
         | study already! And if several hours of study makes you lose
         | interest, or decide it's all fluff evangelized by lisp zealots
         | not worth pursuing further, then go ahead and study something
         | else that interests you. But the time is now. Post-college,
         | you'll likely have less opportunity, less desire, and less time
         | to satisfy your curiosities, so indulge while you can.
         | 
         | And since this is HN, a recent pg twitter thread to
         | contemplate:
         | https://twitter.com/paulg/status/1274632047303315456
        
         | craigsmansion wrote:
         | > [it will] make it easier to express complex human
         | problems/domains into code
         | 
         | What is "pseudo-intellectual" about that answer?
         | 
         | > i'm sooo curious to study all of this and see for myself
         | 
         | Good thing SICP is available online, and there are even
         | recorded classes of it with two legendary professors available
         | online somewhere.
         | 
         | > life's too short and I'm already spending so much time in
         | front of a PC
         | 
         | Yet, here we are.
        
         | aidannlb wrote:
         | You'll learn how to solve problems using recursion and by
         | passing functions around as variables (because you'll have to).
         | Which is useful, because sometimes those are by far the most
         | elegant way of doing things. That's the main practical pay-off
         | I've found. Before going through parts of SICP I found
         | understanding Python code that used lambdas and recursion hard
         | to understand, now I often end up writing such code myself.
        
       | mrspeaker wrote:
       | I re-watch this course every bunch of years, and every time I get
       | something different from it. But mostly it just makes me happy -
       | it's infectious and weird. Especially the "revelation" (spoiler!)
       | https://youtu.be/aAlR3cezPJg?t=2088
        
       | dayvid wrote:
       | I tried to go through SICP and stopped short at Chapter 2. This
       | time around, I used Brian Harvey's CS61A lectures and I'm almost
       | done. He does a good job teaching you the book as well as the
       | content in the book if that makes sense. It's worth a watch if
       | you feel stuck in SICP:
       | https://www.youtube.com/watch?v=4leZ1Ca4f0g&list=PLhMnuBfGeC...
        
         | GeorgeTirebiter wrote:
         | Thank you. Having mentioned this, I wonder if there are
         | similar-in-spirit lectures for Common Lisp? PG has written two
         | books on CL, and I've heard of some Industrial Strength apps
         | written in CL. So, if starting today, it seems like maybe CL is
         | the Right Choice?
        
           | dayvid wrote:
           | I'm not sure about CL lectures in general.
           | 
           | In regards to applying CL to SICP, I would argue that the
           | course is more about the underlying concepts than the
           | language itself. You could probably read a CL reference and
           | write your exercise code in CL instead of Scheme, or just
           | learn CL after the course and it wouldn't be a big leap.
        
       | peter_l_downs wrote:
       | If you want the modern, grad-level version of an MIT scheme
       | class, I highly recommend Sussman's 6.945. I don't know if
       | there's an open courseware version but the entire class is
       | centered around psets, each of which starts with a base
       | environment provided by Sussman and the teaching staff, and which
       | you are required to work in / extend. The class itself was
       | extremely entertaining: you watch Sussman walk back and forth
       | between two transparency projectors, switching the slide on each
       | one as he arrives. Yes, you got very good at reading scheme code
       | very quickly while listening to him talk at the same time.
       | 
       | I understand why MIT decided to make the introductory CS classes
       | more accessible -- they wanted to expand the CS department beyond
       | just those who had already had programming experience by the time
       | they got there, I think? It makes a lot of sense and frankly I
       | found the "replacement" classes pretty great, even while I was
       | taking this class at the same time. Instead of going on at length
       | about how much of a shame it is that MIT "got rid of its scheme
       | class", consider 6.945.
       | 
       | This was one of the handful of classes that I felt were worth the
       | price of admission; I've written code differently ever since.
       | 
       | http://groups.csail.mit.edu/mac/users/gjs/6.945/
        
         | gumby wrote:
         | > I understand why MIT decided to make the introductory CS
         | classes more accessible -- they wanted to expand the CS
         | department beyond just those who had already had programming
         | experience by the time they got there...
         | 
         | Not sure that motivation really applies as back when 6.001 Was
         | introduced most MIT freshman had not programmed a computer
         | before arriving. Also the course was taught a few times to non
         | course 6 faculty who wanted it -- I remember helping a course
         | 21 (history) prof with psets and he had previously never even
         | _used_ a computer.
         | 
         | Also making things "accessible"* isn't really an MIT thing,mor
         | wasn't back when I was there anyway.
         | 
         | * in the sense used in your comment I mean
        
           | peter_l_downs wrote:
           | Like all big changes, I bet it happened for many reasons, and
           | which one is considered the primary driver depends on who you
           | ask. I can tell you that I based this on recollections of
           | talking with the 6.01 instructor when I took it, as well as
           | talking with Abelson and Sussman about it in passing, but
           | also that my memory of that time in my life is extremely
           | fuzzy and should be taken with a grain of salt.
        
         | zerr wrote:
         | Can't find the link, but as I recall in one of the interviews,
         | Hal Abelson explained the reason behind switching to Python:
         | SICP/Scheme was good when systems where small and a single
         | person could understand/create whole systems. Nowadays, systems
         | are huge, lots of parts/components, and programmers mostly
         | write glue code.
        
         | kkylin wrote:
         | There's a book that GJS and Chris Hanson are writing, based on
         | the course:
         | 
         | https://www.penguinrandomhouse.com/books/669475/software-des...
         | 
         | It should be coming out soon. I'd expect it to be available
         | online as well.
        
           | peter_l_downs wrote:
           | Thank you for this link, I didn't know they were writing a
           | book but I just pre-ordered it!
        
       | gabssnake wrote:
       | I've seen the videos and went through -most- of the book
       | exercises. This is a beautiful way to teach and think about
       | programming and it continues to fascinate me.
        
       | losvedir wrote:
       | RIP. I think I was one of the last years to take this wonderful
       | class. I guess it would have been in 2004 or 2005, since I took
       | it as an elective (being an Econ major) on the strength of its
       | reputation. It was hard but so interesting!
       | 
       | Since then MIT has switched its intro CS class to be python
       | based. I suppose that makes a little more practical sense but
       | there's something magical about Scheme that I fear they're
       | missing out on.
        
         | landa wrote:
         | I remember being a freshman and seeing the lecture hall 32-123
         | being temporarily hack-renamed to 6.001, and I didn't know what
         | that was all about. I think it was the last lecture of 6.001,
         | but I didn't know what it was back then.
        
       | shswindell42 wrote:
       | Had a professor show us the first few minutes of the first
       | lecture here. Saying "Computer Science" wasn't a science and that
       | it was really about computers was mind blowing for a freshman CS
       | major.
        
         | xdavidliu wrote:
         | > and that it was really about computers
         | 
         | I think Abelson said in the first SICP lecture that "it was NOT
         | really about computers"
        
       | nanomonkey wrote:
       | Anyone know of similar lectures for the SICM (Structure and
       | Interpretation of Classical Mechanics) book that Sussman also
       | wrote?
       | 
       | I'm also interested in creating a study group to go through the
       | book in Clojure, if possible.
        
       | jll29 wrote:
       | A priceless masterpiece (we used the book in our algorithms and
       | data structures 1 course in 1993).
        
       | akulkarni wrote:
       | This was a great watch. I took this class as freshman, and
       | watching this video now I realize how much of the material was
       | wasted on 17-year old me. :-)
       | 
       | It's a testament to the quality of the teaching that it was eye-
       | opening and inspiring back then at 17, and even more so now when
       | I am 40.
        
       ___________________________________________________________________
       (page generated 2020-06-22 23:00 UTC)