PilOS – A Stand-Alone Operating System
picolisp.com
picolisp.com
I tried adding floating point support to a small Lisp or Scheme interpreter (can't remember which one), and quickly got lost, as I'm not a great programmer.
This definitely looks cool, and I will play around with it. Maybe it's nostalgia, but I grew up with computers that booted into the BASIC prompt, so it brings back the fun of exploring computers for me.
I have tried downloading and compiling large C programs in the past, and it's one of those things where if it works, great, but if the basic "make" comes back with an error for some reason, then I'm kinda lost. My experience with C programming has tended to be with programs numbering no more than a few hundred lines, that all fit in one file and didn't need any kind of "interesting" build process.
Wow, talk about a weird set of customer requirements. ;-)
These micro's have a fair amount of RAM, and the C compilers support memory management, e.g., basics such as malloc() and free(). I suppose somebody could even implement garbage collection.
On the other hand, why not the arduino ? there's no build process , plenty of documentation and libraries, and a reasonable chance you'll find some design close to yours.
At the same time, I've been using Arduino, and also have a fair amount of experience programming Microchip's MCU's in C. I'm actually fine with C, but not so good at wrapping my head around large programs that other people have written. This is probably because I've always been a lone wolf programmer.
The reasons why I want an interpreter on a micro is for some strictly hobby projects that require programmability on board. I started planning an absurd DIY pocket calculator, and actually ggot as far as writing my own parser and expression evaluator in C. But a programmable calculator that uses Python or even Lisp would be a fun novelty.
1. http://www.eluaproject.net/overview/status
2. https://github.com/FMMT666/PIC32LuaDoesn't support full numeric tower (no floats), but does implement 'unbound precision integers'. See §5.1 of this paper: http://www.iro.umontreal.ca/~feeley/papers/StAmourFeeleyIFL0...
Back in 2003, in grade 11, I built a LEGO robot that played the game Connect 4, compiling a mixed C/asm minimax implementation for the RCX via a cygwin toolchain. I can't find pictures of the actual competition, but there's a single pic from a hobby show where it was exhibited:
https://www.flickr.com/photos/sparky1701/4821407356/in/album...
Sometimes not knowing what's impossible is a really good thing.
Now to get Shen running on PicoLisp after Alex adds networking!
That shouldn't be an issue :)
Also this project looks very PC-oriented in other ways (virtual memory management, VGA screen output, keyboard - all of them are PC and no microcontroller devices)
You might be better off starting with a different, more portable, project. As klibertp said, Forth is a possibility. I remember one guy writing a 'Forth bootstrapping framework' called BootForth [1] sometime in 2008, which unfortunately since disappeared off the net, but you may have luck inquiring for the sources.
[1] http://compgroups.net/comp.lang.forth/forth-bootstrapping-fr...
Although I will admit Lisp machines were pretty neat.
Maybe I'll pick it up again after my love affair with Go dries up.
at one point you write a small evaluator, then extend it through macros. Shows you how to get the linguistic trait you'd like in a few lines. One thing lisp has been used to demonstrate since its birth.
(the course uses ruby and sml for other subjects)
The rest of Lisp you appreciate by learning to appreciate real macros.
I think only the functional languages like Haskell and F# come close to the same expressiveness, just from very different angles; auto-currying and lazy evaluation save a lot of boilerplate, and the former is tricky to do in Lisp for precisely one of the reasons it's so flexible (easy variable arguments).
Practically all other languages tend provide expressiveness by having tons of syntax sugar. This introduces a lot of special cases, quirks, and rules that you have to keep in your head to work with the language. It's constant mental overhead that distracts me from the problem I'm working on.
A language like Clojure just gets out of your way and lets you focus on your work without having to worry about its quirks all the time. The code tends to work as expected and does what it looks like it's doing on the first try.
The other big advantage is that s-expressions make it much easier to write structural editors like paredit. With Clojure I'm always thinking in terms of manipulating expressions as opposed to lines of code. I think of taking this block of logic and putting it in there and so on.
Finally, the syntax provides additional visual information about the flow of the program. You can tell what parts of code are interacting with one another simply by looking at the nesting. This makes the code much more easily scannable than other languages.
That can't be the case. Clojure provides 'special forms' and has macros. All those add syntax to the language.
The syntax of Clojure s-expressions is just that: the syntax of Clojure s-expressions - but not the syntax of the Clojure language.
The Clojure site says:
http://clojure.org/special_forms
The syntax for function definitions becomes the following:
(fn name? [params* ] condition-map? exprs*)
(fn name? ([params* ] condition-map? exprs*)+)
Read the word syntax? See the EBNF like syntax descriptions with star, question mark and plus syntax operators? See parentheses structure with [] and () in the second example?star -> zero or more expressions
plus -> one or more expressions
question mark -> one optional expression
That's syntax. It describes the structure of s-expressions which form valid Clojure code.
Not all Clojure s-expressions are valid Clojure code. There are lots of syntactic restrictions. See the syntax for 'fn' above for an example.
> your own private definition notwithstanding.
You may want to take over the Clojure.org site to follow your own, private, definition of Clojure syntax. Personally I prefer the usual definition of Clojure syntax, as for example shown on Clojure.org .
Claiming that Clojure only has s-expressions as syntax is thus wrong and misleading.
But s-expression syntax is not the complete syntax of Lisp programs. Lisp programs are written using s-expressions. But not every s-expression is a valid Lisp program. There is syntax for lambda expressions, various special forms and syntax implemented by macros.
S-expression syntax OTOH is only the syntax for, wait, s-expressions.
A Lisp compiler will check the syntax of Lisp code at compile time:
* (defun foo () (let a ((b 10)) 3))
; in: DEFUN FOO
; (LET A
; ((B 10))
; 3)
;
; caught ERROR:
; Malformed LET bindings: A.
Here the syntax for LET is violated.The syntax for LET is defined as:
let ({var | (var [init-form])}*) declaration* form* => result*
Thus the compiler expects a list of bindings and not a symbol, as in my example above.Every Lisp programmer will need to learn this syntax. Not just ATOM plus (S-EXPRESSION*).
S-expressions give us a textual syntax for data. But not for Lisp. Lisp syntax is built on top of s-expressions and has to be learned. That's true for Scheme, too. See chapter 7.1 of the Scheme R7RS specification: "Formal syntax". That's not s-expressions.
> I'm not really sure what your point here.
That seems to be a common theme for you. I'll help you out: Your original points were this:
> Clojure syntax is s-expressions, your own private definition notwithstanding.
Which I showed you by pointing to Clojure.org to be wrong. Clojure syntax is more than s-expressions.
> The syntax is very minimal and consistent while also extremely expressive.
This also is wrong, since the syntax consists of all kinds special forms and macros, too. The user can even introduce lots of new syntax by implementing it as macros. Every library with macros is likely introducing new syntax and semantics.
The second was incremental compilation. I was an imperative programmer and mostly used that style. Languages such as C++ interrupt one's mental flow with long compile cycles. Interactive languages, especially scripting, tended to be too slow in production. LISP let me compile individual functions in a fraction of a second after writing them. Think, type, hit button, examine results, and repeat. The flow stays there and you just keep pumping out more of your solution. That my main DSL was compatible with a C++ subset meant I could just autogenerate that at the end to benefit from its compilers or portability. Otherwise, I stayed in LISP.
The third thing was something that I tried with C/C++. Self-modifying code for AI and security applications was one use. Another was updating apps live. LISP made both pretty easy. The program ran as an instance while you made it in certain development environments. You were in a way always working with a live program. Also, you could drop a member variable in a class definition and all running instances of that class would loose it. Just like that. So easy to change while being able to compile to fast code with type & safety level declarations.
So, it was a language that could do anything I want it to do, allow rapid iterations at max flow, and even change running systems if they weren't good enough. Still haven't felt this full effect in other languages. The old LISP machines went further [1] in that they could take you to any problem in the app or OS right at the source code without crashing. Like LISP apps, you can inspect the issue, modify the code of the running system, optionally modify the instance, and proceed how you wanted to. Still waiting for that feature in Windows or Linux development. ;)
Though I believe your example would just be written as
(sudo apt-get install racket chromium-browser)Then, there was an effort to port Scsh to the GNU Scheme, but the work was lost or abandoned somehow if I understood it correctly.
For people spending a lot of time on with Unix shell(s), a great Lisp/Scheme shell might have been the entering point. But somehow the great work that has been done at the beginning cannot be brought to masses.
It's a pitty.