Hacker News new | past | comments | ask | show | jobs | submit login
NewLisp (newlisp.org)
86 points by jsnathan on Sept 25, 2015 | hide | past | favorite | 81 comments

Has anyone ever used NewLisp for something interesting? Would you mind talking about your experience? NewLisp, despite the name, is actually quite old at this point, and its release cycle has slowed down a bit over the years. I'm assuming it landed so high on the front page because people are interested, so some real-life stories would be helpful.

(I have a real-life story that concludes with "so I got fed up and rewrote the thing in Python", but I'm not all convinced that the problem wasn't with me.)

Hi there! I fell in love with newLISP a few years ago, mostly for its clean documentation, the fact that everything seemed to make sense, and the fact that it was small and fast.

I found the newLISP web framework Dragonfly and adopted it to build a prototype website for my previous company. I used Solr for the document storage engine, and used newlisp's excellent native XML conversion to convert an ugly XML feed into a newLISP list and then into individual Solr documents. Then I used Dragonfly to write a front-end searching application that was launched to a select group of our customers. newLISP made it really easy to prototype rapidly and deliver new features quickly.

Dragonfly stopped being updated, so I decided I wanted to make my own web framework. That became newLISP on Rockets (www.newlisponrockets.com) and I released the source on GitHub.

Although I haven't updated the newLISP on Rockets website much lately, it's mostly because I'm too busy using Rockets in my current job. I built a searching application for all our documentation, and now I'm busy building business intelligence stuff.

It's nothing too fancy, and I don't consider myself a great programmer at all. But I love the fact that newLISP allowed me to make all these things quickly and with few lines of code, and it's easy for me to maintain them afterwards. That's the true value that newLISP has for me.

Nice work on Rockets: the website feels zippy. Not something you can say of web libraries these days.

What is a good starting point to pick up on newLISP for someone new with programming? I'd like to do some automation (parse lots of unstructured text) to get good data, create PDFs, accept data from email and have a lightweight web front-end.

I'd start with the newLISP documentation, particularly the Code Patterns page: http://www.newlisp.org/CodePatterns.html

This is what I learned the language from, and after I got a handle on it I just used their reference manual: http://www.newlisp.org/downloads/manual_frame.html

I'm planning on writing some "intro to web development with Rockets" white papers, but work is keeping me really busy at the moment.

I recommend picking up the CodePatterns docs. They're always updated and You'll learn a lot from them.


Then there is my original Dragonfly documentation


I've written several web applications in newLISP and the Dragonfly Framework (Disclaimer: I'm one of the developers behind the framework). Most of the web apps are running in sales companies. I think it's a very good and easy to learn language for scripting purpose. I use the built-in parallel processing support for scraping, storing data in newLISPs efficient red-black tree implementation and finally serve APIs.

It is so tiny, I have easily deployed it in the form of a 300k something executable and ran across hundreds of hosts. Very good for OPS work. Excellent scripting language , IMHO.

I remember looking at it 12 years ago or so, for embedded applications. For some reason I decided to go with ISLISP instead, though I no longer remember why.

oh, so newlisp is not that much new then.

It used to be. It's kind of a bug with new.

> oh, so newlisp is not that much new then.

Well, its new compared to Lisp in general.

its features are comparable to old Lisps from the 70's, prior to Scheme and Common Lisp. Nothing really new here at all and lots of old bugs passing for features.

Invented 1991 according to Wikipedia.

> For some reason

Wouldn't 99% of people see GPL and move on?

You are being downvoted, unfairly — that was probably the reason why I could not use it back then. And just to clarify, because these discussions often get sidetracked: the GPL is a problem in a commercial setting not because of the source availability requirement, but because of the anti-patent clause, which is basically a minefield.

Dynamic scope.

Pass everything by value.

No closures.

No GC.

Implement almost the whole thing in one giant 7k line file[1].

I can't tell if this is a work of genius or madness.

[1]: https://github.com/kosh04/newlisp/blob/develop/newlisp.c

I'm just going to list all of my criticisms after reading what's on the website:

1. Treating functions as lists effectively makes this a weakly typed language like C, whereas both Scheme and Common Lisp are both strong.

2. What advantage does having implicit function arguments (using nil if not provided, not default arguments) have at all unless if you just hate type safety and would prefer unreliable software? There are lots of other ways to maintain type safety while eliding runtime type checks in hot loops.

3. Changing the binding time for free variables within a closure would also imply that a binding by that name must be in scope at the time the function is called, no? This sounds like dynamic scoping... which is known to be difficult to use and error prone. Do you just assume 'nil' when no binding exists?

NewLisp was designed by a psychologist, who took meticulous care to endow it with design elements such that it would be instantly hated and denounced by anyone who has had anything to do with real Lisp, causing them to spew babble that is incomprehensible to NewLisp n00bies, save for the lingering perception that something gratuitously negative has been spoken. This, in turn, has the calculated effect of making them dig deeper into their trenches.

It is best to remain silent upon the subject of the NewLisp design. Let people make their bed and lie in it.

By the way, if you want to see a really crazy NewLisp zealot, search for Kazimir Majorinc. Wow ...

Maybe he's quit since (and even reformed?); it's been a few years.

> Changing the binding time for free variables within a closure

What closure? NewLisp has done away with those, and offers "name space contexts"


These are basically something like modules with static variables.

I'm not sure it's fair to tar all newLISP advocates with the same brush. I understand the design choices that Lutz Mueller made, and I can understand how they might be considered unsatisfactory by other Lisp users. That's fine-- I don't expect newLISP to be everything to everybody, and I don't consider it to be the be-all and end-all of languages.

I do find it to be very lightweight and flexible, with excellent documentation and a good built-in library. This makes it useful as a scripting language and for rapid prototyping. I wouldn't recommend it for very large-scale tasks or for projects developed by large teams.

> I don't expect newLISP to be everything to everybody, and I don't consider it to be the be-all and end-all of languages.

Lutz Mueller does. For instance, quote: LISP is an old language born, grown, and standardized in times very different from today, times when programming was for highly educated people who engineered programs. newLISP is LISP reborn as a scripting language: pragmatic and casual, simple to learn without requiring you to know advanced computer science concepts.

Sure, no advanced computer science concepts: just five different hacks to choose from to do some aspect of what a lexical closure does. (Just pick the one whose assumptions are least likely to break in your use case: but no engineering knowledge required to do that, nope!)

NewLisp requires the users to absorb advanced concepts that have fallen by the wayside of the computer science mainstream. A fexpr or self-modifying code are still computer science concepts.

Basically what Lutz is the real problem in NewLisp; other than that, the thing is what it is, take it or leave it. More than needing a compiler, garbage collection or lexical closures, it just needs a dose of humility, really.

On that note, it's somewhat good to see that a lot of the anti-Lisp ranting has been toned down compared to just several years ago. I don't get the sense that Lutz is yet eating any real crow. At best, he's pouring crow-flavored syrup over his ice cream. But at least that's a start!

Haha, indeed that pattern is fun. It reminds me of people using placeholders in BASIC source to store state. I'm not sure I'm reading right.

1. I don't think so. I've used Newlisp and it behaves like your regular dynamically typed language.

2. This question reduces to static versus dynamic typing.

3. It is dynamic scoping.

As a Forth lover - Forth which sacrifices everything including types for efficiency and simplicity - I find Newlisp quite impressive: it is on the same order of magnitude as Lua size-wise (speed-wise it is more like Python according to some old benchmarks), but includes a ton of interesting functions and features where Lua is just bare-bone. Also the fact that it operates without a GC and without requiring manual memory management is quite a feat, even if it has some downsides. The real weakness of Newlisp to me - if you can get over dynamic scope and typing - is its poor error reporting and debugging support.

Even with all its problems, IMO Newlisp is a good "hacker's language". Small, not too slow, flexible, good standard library, runs anywhere (I've compiled it for an embedded platform running uClinux).

People interested in NewLisp may also like Pixie, a small Clojure-like scripting language.


But, newpLisp's tiny C codebase can be compiled and made to run on even obscure UNIXes like AIX, Solaris, HPUX etc without installing any dependencies which Pixie needs.

Of course, Pixie is not the most appropriate tool for every possible application. How fortunate that we have so many great open source tools to choose from!

There's also Planck, a Clojurescript lib that allows you to write shell scripts in Clojurescript.


The memory management scheme is very novel: http://www.newlisp.org/MemoryManagement.html I don't get how it can work since it would require most objects to be passed by value and not reference.

It isn't novel. Basically, it assumes that objects are stack allocated and blows them away when expressions finish evaluating. Anything which escapes out of an expression is copied, so there is no reference graph.

Copying objects to avoid lifetime computations is far, far from novel. It is ancient. Think about all the C program modules that use strdup on strings that are passed around, over the place, so that they can then `free` their copy with confidence that nobody else has a pointer to it. In C++, there are smart pointers for one-reference only, like std::unique_ptr. (Long before that became standard, C++ coders did similar things from scratch.)

Stack allocation of temporaries which go away when a stack frame is blown away is certainly not new. The implementor of NewLisp just had to look to the implementation language C to get this idea.

Mature Lisp implementations have this as a built-in optimization in their compilers. That is to say, recognizing non-escaping temporary objects and optimizing their reclamation, and even allocating them on the stack. ANSI Common Lisp also has the (declare (dynamic-extent ...)) declaration to manually request, or suggest that this may be done with an object. (The programmer promises not to let that object escape, and in return, the implementation can stack-allocate it.)

NewLisp's claim is that the memory managent is novel in interpreters (because the author knows that Lisp compilers can identify temporary objects that don't need to be retained past the evaluation of their containing expression). Is it really novel? It might be true of the limited number of interpreters that the author knows about. If we were to exhaustively research the history of computing, we'd probably find other interpreted languages with copying memory management. Oh, here is one: GNU Bash. Look for uses of the function copy_word_list in the Bash sources. GNU Bash seems to be implementing "ORO" memory management for lists of strings passed around as arguments and other structures.

I'm not able to make sense of why it would not just be region-based memory-management. (http://www.sciencedirect.com/science/article/pii/S0890540196...). The usual way this fails is that everything ends up bubbling up to the top-most context, which is basically uncollectable. So you leak to death unless you limit yourself in awareness of this possibility.

I was hoping that their might actually be a linear type system hiding out in there, but alas, such is not the case.

On a tangentially related note, there's a project that aims to redesign some of Common Lisp's semantics to be more modern [0]. Its name is CL21, as it's meant to be "Common Lisp for the 21st century", and it's written entirely in Common Lisp, relying on the kick-ass features of reader macros to introduce new syntax to the language. In my humble experience, integrating it with Shelly [1] and the large swath of Quicklisp [2] libraries can turn it into a terse and reasonably efficient scripting language. (Sadly, you still need a CL implementation and runtime, and they are mostly quite slow.) Definitely worth a look if you like NewLisp's syntax and libraries, as I can see some similarities in the philosophies.

[0]: http://cl21.org/

[1]: http://shlyfile.org/

[2]: https://www.quicklisp.org/beta/

> Sadly, you still need a CL implementation and runtime, and they are mostly quite slow.

Say what now? SBCL is normally within a factor of 2 of C, and sometimes faster than C, and the commercial Lisps are even better.

I was referring more to their startup time. The runtime introduces delay when you type in the script command on a CLI.

Regardless of that, the factor-of-two-or-sometimes-faster argument sounds a little far-fetched for me, care to provide some sources on the benchmarks? Not saying it's not true, I'm just not accustomed to seeing highly extensible and dynamically-typed languages such as Common Lisp perform so fast.

Check out the benchmark game for some decent benchmarks of various languages. Here's sbcl vs gcc c:


On several benchmarks sbcl is less than three times slower than c.

And I never noticed a startup delay with sbcl. Let's do a simple test.

    $ echo 'print("hello")' > test.py
    $ echo '(format t "hello")' > test.lisp
    $ time python test.py
    real    0m0.033s # 33ms 
    user    0m0.027s
    sys     0m0.003s
    $ time sbcl --script test.lisp
    real    0m0.006s # 6ms
    user    0m0.000s
    sys     0m0.003s

    # I couldn't figure out how to run newlisp w/o starting
    # the interactive interp so I'll give it a string
    $ time newlisp -e '(print "hello")'
    real    0m0.002s # 2ms
    user    0m0.000s
    sys     0m0.000s
So sbcl starts up about 5 times faster than python, which lots of people use for scripting. newlisp seems to startup about 4ms faster than sbcl. I really don't see a scenario where the startup time of sbcl is a problem. Just for fun let's look at java.

    $ java -version
    openjdk version "1.8.0_60"
    OpenJDK Runtime Environment (build 1.8.0_60-b24)
    OpenJDK 64-Bit Server VM (build 25.60-b23, mixed mode)
    $ time javac hello.java
    real    0m0.386s # ouch
    user    0m0.910s
    sys     0m0.040s

    $ time java hello
    real    0m0.066s # 66ms, once compiled
    user    0m0.067s
    sys     0m0.007s

sbcl is fast, and can be really fast. Especially compared to the other cl implementations.

Commercial Lisps are better? As in faster? Do you have any supporting evidence of this? Having used Lispworks and Allegro I can't see where this is coming from.

I discovered this a while back, because Nearly Free Speech has it as a CGI scripting language. The details of it's GC was rather interesting -- I've been meaning to implement it in one of my lisp projects.

EDIT: I just checked, apparently nfsn doesn't support that? Weird, now I have to work out what website I found it through...

It is listed as a LISP on the NFS CGI versions page:


Ah, that's where it got to! I was searching somewhere entirely different for some reason. Thanks.

Last time I used nfsn, they supported newLisp. It's possible that they dropped support.

Apparently they still have it, I was just searching in the wrong place :)

This is an honest question: why create a lisp instead of a scheme? What is the fundamental feature that makes NewLisp a LISP more that a scheme language?

> why create a lisp instead of a scheme?

In the broad sense, Scheme is a Lisp.

In the abusively narrow sense, where "lisp" is used to mean "Common Lisp", newLisp is not a lisp.

> What is the fundamental feature that makes NewLisp a LISP more that a scheme language?

Scheme is a restrictive group, roughly equivalent to Common Lisp. Common Lisp and Scheme are both members of the broader group, "lisp". Racket -- which was renamed that from PLT-Scheme because it was not strictly a Scheme -- is a Lisp that is neither Common Lisp nor Scheme.

NewLisp, while neither a Scheme nor a Common Lisp, seems to be more like a Scheme than a Common Lisp (though farther from Scheme than Racket is.)

Its differences from other lisps are discussed: http://www.newlisp.org/index.cgi?page=Differences_to_Other_L...

racket is a superset of scheme. I write perfectly valid scheme code and run in racket even with the #lang racket tag... now, let's not get started on RxRS compatibility...

newLISP is not a derivative of Common Lisp or Scheme or any other Lisp. It's a different language in a similar style.

I wish the Common Lisp camp wasn't so insistent on equating "Lisp" to "Common Lisp." It's annoying having to tiptoe around them by saying "Lisp-like language."

I notice that the old-school Common Lispers tend to call their language "Lisp." I (a new-school one) always say CL or Common Lisp. I'm not sure why they do that. When I say "a lisp" or "lisp" I'm referring to the family of languages or some idealized lisp.

I call CL "lisp." The reason is that CL was invented to unify lisps. It did a great job. There are no other contenders in the space. Other languages in the lisp family have their own names. A language can be "a lisp" or in the "lisp family", but in my eyes Lisp is (Common) Lisp. Scheme is Scheme. Clojure is Clojure. Etc.

> I wish the Common Lisp camp wasn't so insistent on equating "Lisp" to "Common Lisp."

But that's what Common Lisp is: it's the common Lisp-like language which (should have) united all the disparate dialects of Lisp.

> It's annoying having to tiptoe around them by saying "Lisp-like language."

What's annoying to me is that people keep on sinking time an effort into new Lisp-like languages instead of just using Common Lisp (or, gasp, working on a next-generation CL).

There's a lot of hard-earned wisdom in CL; even the majority of the cruft exists for good reasons.

Think of it as an early warning system.

You immediately know who the idiots are, so you don't need to waste any time finding that out for yourself.

I put Clojure in the same category, if we examine it outside the Java ecosystem, a language that is the definition of "premature optimization" (all the concurrency and immutable datastructure features are available as libraries in CL) and has no business existing in a universe where CL exists.

But of course people want to work with Java and so on and so forth. Tight Java interop is what makes Clojure worthy of existence and of course, why would any sane Lisper want to work in the Java ecosystem?

When people developped Rust or Go, did they say "this is a C", or "This is newC"? They said: "this is new language with a C-like syntax with such and such features". Why not be precise?

When Stroustrup created C++ or Hejlsberg created C#, did C progammers spend decades whining about their choice of names and alienating newcomers?

They didnt have to, neither Stroustrup nor Hejlsberg called their languages "a C".

to be fair though, lisp is about a lot more than just its syntax

Why would I call a 'new' language 'Lisp' when it can't run a single line of Lisp code from the past 50 years?

Give it a different name. Not every random language which happens to use parentheses in some way needs to be called Lisp.

99% of the time, the word "lisp" does not mean "Common Lisp" specifically. When you mean Common Lisp, you say Common Lisp. When you mean any language in the family of lisp languages, you say lisp. This includes hundreds of languages.

Ever heard of Lisp 1.5, UCI Lisp, MacLisp, ISLisp, New Implementation of Lisp, Lisp Machine Lisp, Standard Lisp ,Franz Lisp, Emacs Lisp, ISLisp, Autolisp, Visual Lisp, and many many other Lisp dialects?

Notice something?

These all have Lisp in their name. They all share a core language.

None of those is Common Lisp, but Common Lisp is directly related to them, since it also shares the same core language.

Common Lisp can easily run Lisp code from 50 years ago.

Newlisp can't.

To be honest, I'm not sure what point you are making. But I know that my point still stands.

> To be honest, I'm not sure what point you are making.

I'll repeat it for you: Lisp dialects are defined by a common core language.

Newlisp does not have that core language. Even if it uses the same name for functionality, it does different things:


    (cons 1 2) -> (1 . 2)

    (cons 1 2) -> (1 2)

    (+ 1.2 2) -> 3.2
newlisp (+ 1.2 2) -> 3

That's just the trivial stuff.

It's basically impossible to run any Lisp code in newlisp without completely rewriting it.

When I say Lisp, I'm talking about a language which is in the tradition of McCarthy's Lisp, where I don't need to throw away my books, implementations, libraries, applications.

newlisp is a derived language just like ML, Logo, Javascript, Racket, Clojure and countless other languages. Just like Java is not a C dialect, but somehow influenced by it.

Clojure is widely considered a lisp, but it also does not have cons cells. You are free to use your own definition of "lisp" but it is contrary to the widely accepted use of the term.

I don't think Clojure is a Lisp. iT's just another Lisp inspired language.

Again, zero code of the past fifty+ years of Lisp runs in Clojure. iT is fully incompatible with any Lisp dialect. It shares zero lines of code.

Don't believe what people tell you, think yourself. if you had a language, which uses { and }, would you call it a C, if it is 100% incompatible to any line of C written out there?

For some reason some people think any random incompatible language with parentheses is a Lisp. That's because they use some completely unspecific definition of Lisp, which is based on vague features, but which has no practical consequences.

> if you had a language, which uses { and }, would you call it a C, if it is 100% incompatible to any line of C written out there?

No, but nobody else would either. For Lisp and Forth dialects, people seem to accept that they are not all backwards compatible with a specific implementation or spec, but are the same family of languages. [1]

Clojure's and Racket's official docs both refer to the languages as Lisp dialects (Racket) or Lisps (Clojure). Other reputable sources also consider them to be dialects of Lisp.

If it doesn't meet your own prescriptive criteria for being called a Lisp, that's fine, but the parent is only being pragmatic in using the same sense that is widely used and accepted.

[1] FWIW, I've always read "is a Lisp"/"Lisps" as "is a Lisp dialect"/"Lisp dialects" and think that most others do as well. Not necessarily married to implementation details or compatibility.

homoiconism is a feature of the lisp that has important consequences like tail-call optimization. Replacing the use of macros or recursive algorithms leads to terse OO equation that is not as readable as the expression of the same "algorithm"/"intent" using macros and recursion.

99% of the time? Common.

heh, don't confuse the readers

It's not so much the readers we need to be concerned about here, but the evaluators.

good one

It's very much a Lisp dialect in the sense of McCarthy's Lisp.

There is some life beyond Common Lisp :).

It isn't. Newlisp shares that not much with McCarthy's Lisp. newlisp does not even have linked lists, it has a different evaluation model, ..., no GC.

Languages like Standard Lisp, Franz Lisp, ISLisp, Eulisp, Emacs Lisp, Visual Lisp are in the Lisp tradition and share a core language.

newlisp is a different language. Call it ParenthesesScript, ContextScript or something like that.

> does not even have linked lists

Conses are different in newlisp, but it certainly does have linked lists:

> In newLISP, there are no dotted pairs. Instead, each newLISP cell contains one object and a pointer to another object if the cell is part of a list.

> different evaluation model

That one is true, yes.

> no GC

No, but it implements McCarthy's original intent through the ORO scheme. NewLisp's ORO thing is very annoying if you ask me, but it does its job; it achieves the same thing that McCarthy mentioned in his paper: "This process [...] is more convenient for the programmer than a system in which he has to keep track of and erase unwanted lists. Its efficiency depends upon not coming close to exhausting the available memory with accessible lists etc."

Let's not delude ourselves here. NewLisp is not necessarily one of the "better" Lisp implementations, but it has S-expressions, Scheme-like function application and automatic memory management. I think that's reason enough to call it SomethingLisp.

> Conses are different in newlisp, but it certainly does have linked lists

These are different. newlisp seems to have a list cell, which then points to linked content cells.

A mechanism which is different from any other Lisp dialect.

> newlisp does not even have linked lists

No, it does. Linked list are the fundamental data structure; the difference with respect to linked list from other lisps is, in fact, that in newLisp linked lists are fundamental, not just one application of cons cells, so you can't have a cons cell where cdr is not a proper list.

Scheme is a Lisp. I've never met anyone who disagrees.

You can find a lot of disagreement in the google groups thread linked. Erik Naggum, Ron Garret (posting as Erann Gat), and Kent Pitman show up. Naggum as usual penetrates the usual back-and-forth with a stimulating meta-argument.


I've pasted some text from that thread. I pasted reasons not because of their quality, but to show that there were people passionate about the distinction.

> at the Lisp & Functional Programming conference, there was serious difficulty getting Lisp papers accepted. Lisp papers were about engineering, and Scheme papers were about mathy and theoretical issues. And, to be utterly crude about it, what I think gets papers accepted to such conferences is heavy use of greek letters

> a scheme program is defined as a string of characters whereas a CL program is defined as a sequence of lists of Lisp objects. This may seem pedantic or trivial but a lot of different design decisions follow from this. It makes Scheme an infix member of the Algol language family.

> The Scheme community has evolved a set of values at odds with the spirit of Lisp: the goal for simplicity at the expense of convenience (compare the concept of CL's $item designators with the design of convert stuff explicitly like Scheme's exact->inexact), the goal of only giving basic blocks and letting you assemble stuff yourself (call/cc isn't a replacement for a worked out exception system).

> I think it's a small group of insecure Scheme users who think that they should be considered "A Lisp" so that they get all the "publicity" that Lisp does along with the publicity that Scheme does.

> What those Schemers get from defaming Lisp beats me. Probaby some sort of jealous envy.

> a scheme program is defined as a string of characters whereas a CL program is defined as a sequence of lists of Lisp objects. This may seem pedantic or trivial but a lot of different design decisions follow from this. It makes Scheme an infix member of the Algol language family.

Does anybody have any idea what he is referring to? I can perhaps see the first part being true, even though most of rnrs speaks in terms of objects.

But how in the heck could Scheme possibly be considered infix, or "an" ALGOL?

> Scheme is a Lisp.

No, it isn't.

> I've never met anyone who disagrees.

Now you have.

You might do more than just disagree. You might supply some reasons why you think Scheme isn't a Lisp. That would make a much more informative post.

> You might do more than just disagree.

He didnt do more than just claim it.

> You might supply some reasons why you think Scheme isn't a Lisp.

So you want a negative proof without providing a positive proof first?

> That would make a much more informative post.

So why didnt you remind the previous poster of this, instead of reminding me?

True. He didn't do more than just claim it.

I replied to you because, while an unsupported claim is regrettable, an unsupported denial takes you all the way into "Is too! Is not!" 5-year-old-style argument. iak8god started down that road; your reply went further down it.

It also seemed to me that your attitude was sharper than iak8god's. Your reply to me did not change that opinion.

> So you want a negative proof without providing a positive proof first?

Yes. I want you to try to be better than the person you're replying to, rather than trying to be at least as bad.

I suppose I should have said "Scheme is, and always has been, widely considered a Lisp."

Do you need more "proof" of this than Wikipedia https://en.wikipedia.org/wiki/Scheme_%28programming_language... ?

Isn't Scheme a Lisp 1?

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact