microKanren
awesome-cl
microKanren | awesome-cl | |
---|---|---|
2 | 64 | |
298 | 2,456 | |
- | - | |
0.0 | 8.7 | |
almost 10 years ago | 11 days ago | |
Scheme | Makefile | |
- | GNU General Public License v3.0 or later |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
microKanren
-
Lisp-Stick on a Python
which uses a Lisp to define itself. This means roughly that if you understand enough Lisp to understand this program (and the little recursive offshoots like eval-cond), there is nothing else that you have to learn about Lisp. You officially have read the whole language reference and it is all down to libraries after that. Compare e.g. with trying to write Rust in Rust where I don't think it could be such a short program, so it takes years to feel like you fully understand Rust.
Indirectly this also means that lisps are very close at hand for “I want to add a scripting language onto this thing but I don't want to, say, embed the whole Lua interpreter” and it allows you to store user programs in a JSON column, say. You also can adapt this to serialize environments so that you can send a read-only lexical closure from computer to computer, plenty of situations like that.
Aside from the most famous, you have things like this:
1. The heart of logic programming is also only about 50 lines of Scheme if you want to read that:
https://github.com/jasonhemann/microKanren/blob/master/micro...
2. Hygienic macros in Rust probably owe their existence to their appearance in Lisps.
C2 asks the same question here: https://wiki.c2.com/?LispShowOffExamples with answers like
3. The object model available in Common Lisp was more powerful than languages like Java/C++ because it had to fit into Lisp terms (“the art of the metaobject protocol” was the 1991 book that explained the more powerful substructure lurking underneath this object system), so a CL programmer could maybe use it to write a quick sort of aspect-oriented programming that would match your needs.
4. Over there a link shows how in 16 LOC you can implement a new domain-specific language to define and run finite state machines: http://www.findinglisp.com/blog/2004/06/automaton-cleanup.ht...
-
William Byrd on Logic and Relational Programming, MiniKanren (2014)
> I think that with such modern additions (i.e. apart from the cut) Prolog moves closer to the declarative ideal without sacrificing its all-around usability as a general purpose language. What do you think?
I also used to think that Prolog was moving closer to the delcarative ideal. And I suspect that most expert Prolog programmers believe similarly.
However, my attitude has changed in the past few years, after seeing Prolog programmers try to implement the relational interpreter from the 2017 ICFP pearl in Prolog.
The problem is one of composing the pure features needed for expressing a program as complicated as the relational interpreter. (Of course, the relational interpreter is designed to be as short and simple as possible, bit it is still more complicated than pure relations you will find in a Prolog textbook, for example.)
In theory, you can easily combine unification with the occurs check, SLG-resolution, disequality/disunification constraints, type constraints, etc., and avoid all impure uses of extra-logical features. In practice, I've seen people struggle to combine these features within a single Prolog implementation. In fact, after multiple attempts from multiple Prolog experts, I have yet to see a version of the relational Scheme interpreter in Prolog that can match the behavior of the miniKanren version.
I'm not claiming that someone couldn't implement a full relational interpreter in Prolog. Obviously they could, since Prolog is Turing-complete. I'm only saying that the default choices of Prolog, plus the intricacies of combining multiple pure features (and leaving out standard and useful non-relational features), seems to make writing a relational interpreter much harder than I would have expected.
If you are up for a challenge, I'd be happy to work on a Prolog version of the Scheme interpreter with you!
Based on what I've seen from Prolog experts trying to reproduce the relational interpreter, and conversations with Prolog experts, my current thinking is that Prolog is actually not a good language for relational programming. Too many of the defaults must be adjusted or overridden, too many standard techniques and idioms must be abandoned, and too many potentially incompatible libraries must be composed in order to get everything "just right."
The problem isn't that relational programming in Prolog isn't possible. The problem is that it requires enough work and non-standard techniques that in practice people don't do it.
At least, that is what I observe as an outsider.
If there is an easy way to combine features within a single FOSS Prolog implementation to allow for the types of relational programming we do in miniKanren, I'd be delighted to see it in action. I'd also be delighted to write a paper about it with you! :)
> Finally, I'd like to know more about minikanrens' search. I'll look around on the internet, but is there a source you would recommend?
I would recommend reading Jason Hemann and Dan Friedman's lovely little paper on microKanren, which gives a tutorial reconstruction of miniKanren's complete interleaving search, starting from depth-first search:
http://webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf
https://github.com/jasonhemann/microKanren
The standard exercise for learning microKanren is to translate the resulting ~50 lines of Scheme code into the language of your choice.
You might also like this more technical paper on the `LogicT` monad:
Backtracking, interleaving, and terminating monad transformers: (functional pearl)
awesome-cl
-
3 years of fulltime Rust game development, and why we're leaving Rust behind
I know you're not asking for recommendations, but Lisp, particularly SBCL, really seems to check all your boxes. I say this as someone who generally reaches for Scheme when it comes to Lisps too.
There are a few game engines[0] for CL, but most of them seem to be catered specifically to 2D games.
[0] https://github.com/CodyReichert/awesome-cl?tab=readme-ov-fil...
-
KamilaLisp – A functional, flexible and concise Lisp
Hello, a single counter-example I hope https://lispcookbook.github.io/cl-cookbook/editor-support.ht...
(see more from https://github.com/CodyReichert/awesome-cl?tab=readme-ov-fil...
https://cl-community-spec.github.io/pages/index.html
and some more)
-
Why Is Common Lisp Not the Most Popular Programming Language?
Everyone, if you don't have a clue on how's Common Lisp going these days, I suggest:
https://lisp-journey.gitlab.io/blog/these-years-in-common-li... (https://www.reddit.com/r/lisp/comments/107oejk/these_years_i...)
A curated list of libraries: https://github.com/CodyReichert/awesome-cl
Some companies, the ones we hear about: https://github.com/azzamsa/awesome-lisp-companies/
and oh, some more editors besides Emacs or Vim: https://lispcookbook.github.io/cl-cookbook/editor-support.ht... (Atom/Pulsar support is good, VSCode support less so, Jetbrains one getting good, Lem is a modern Emacsy built in CL, Jupyter notebooks, cl-repl for a terminal REPL, etc)
-
Common Lisp: An Interactive Approach (1992) [pdf]
check out the editor section, there's more than Emacs these days: https://lispcookbook.github.io/cl-cookbook/editor-support.ht...
- https://github.com/CodyReichert/awesome-cl for libraries
- https://www.classcentral.com/report/best-lisp-courses/#ancho...
- a recent overview of the ecosystem: https://lisp-journey.gitlab.io/blog/these-years-in-common-li... (shameless plug, on HN: https://news.ycombinator.com/item?id=34321090)
-
Spinneret: A modern Common Lisp HTML generator
More HTML generators for CL: https://github.com/CodyReichert/awesome-cl#html-generators-a... there are lispy ones (Spinneret), Django-like ones (Djula, I like it, easy to use and extend), HTML-based allowing for inline Lisp code (Ten), JSX-like ones (lsx, markup), and more.
-
Common Lisp JSON parser?
https://github.com/CodyReichert/awesome-cl is usually a good place to find recommendations. Jzon is pretty good.
-
All of Mark Watson's Lisp Books
> obstacles add up
I actually agree. It wasn't smooth for me to ship my first CL app. It's all better now (more tools, more documentation, more blog posts from several people, more SO questions and answers!).
> performant
SBCL is in the same ballpack of C, Rust or Java in many benchmarks.
In this article series, the author writes the same program in CL, Rust and Java. In fact, he copy-pastes a PG snippet from 30 years ago. This snippet beats Rust and Java in LOC and speed. But, yeah, he wasn't writing super efficient Rust code, so after many discussions, pull requests and sweating, the Rust code became the most performant. https://renato.athaydes.com/posts/revisiting-prechelt-paper-... It didn't take work to make the CL code performant, more so for the Rust one ;)
a benchmark after sb-simd vectorization: https://preview.redd.it/vn5juu36v2681.png?width=715&format=p... (https://www.reddit.com/r/Common_Lisp/comments/riedio/quite_a...)
> good tools for networking, for writing concurrent or asynchronous code, for graphics,
I refer the reader to https://github.com/CodyReichert/awesome-cl but yes, CL won't have the best libraries in some scenarii (GUI? Tk libs are good, we have Gtk4, a Qt5 library used in production© by a big player but difficult to install etc)
> it doesn't give you a good package manager or means of distributing code
Quicklisp is neat, with limitations, that can be addressed with Qlot, ql-https, or CLPM or the newest ocicl.
-
How to Understand and Use Common Lisp
It's a good book!
Modern companions would be:
- the Cookbook: https://lispcookbook.github.io/cl-cookbook/ (check out the editors section: Atom/Pulsar, VSCode, Sublime, Jetbrains, Lem...)
- https://github.com/CodyReichert/awesome-cl to find libraries
Also:
- https://stevelosh.com/blog/2018/08/a-road-to-common-lisp/
- https://news.ycombinator.com/item?id=34321090 2022 in review
-
Why Lisp?
> static strong typing
Alright, here is it: https://github.com/coalton-lang/coalton/
> small efficient native binaries
The numbers are: with SBCL's core-compression, a web app with dozens on dependencies will weight ±30 to 40MB. This includes the compiler, the debugger, etc. Without core compression, we reach ±150MB.
> The actor runtime?
the actor library: https://github.com/mdbergmann/cl-gserver
> couldn't find a way to make money with it. I suspect many other programmers are in my boat.
Alright. Some do, that's life. Yes, some companies go with CL even in 2023 (https://lisp-journey.gitlab.io/blog/lisp-interview-kina/, they released https://github.com/KinaKnowledge/juno-lang lately; Feetr (finance): https://twitter.com/feetr_io/status/1587182923911991303)
https://github.com/azzamsa/awesome-lisp-companies/
> Give us an HTTP (1.x & 2.0) and WebSockets libraries
How so? We have those libraries. HTTP/2: https://github.com/zellerin/http2/
https://github.com/CodyReichert/awesome-cl
-
Peter Norvig – Paradigms of AI Programming Case Studies in Common Lisp
https://leanpub.com/lovinglisp -- this one is great, and the first thing I recommend
https://lispcookbook.github.io/cl-cookbook/ -- also great and up to date
https://awesome-cl.com/ -- for anything else.
What are some alternatives?
mediKanren - Proof-of-concept for reasoning over the SemMedDB knowledge base, using miniKanren + heuristics + indexing.
cl-str - Modern, simple and consistent Common Lisp string manipulation library.
dissertation-single-spaced - Single-spaced version of my dissertation, 'Relational Programming in miniKanren: Techniques, Applications, and Implementations'
awesome-lisp-companies - Awesome Lisp Companies
calysto_scheme - A Scheme kernel for Jupyter that can use Python libraries
coalton - Coalton is an efficient, statically typed functional programming language that supercharges Common Lisp.
trial - A fully-fledged Common Lisp game engine
Petalisp - Elegant High Performance Computing
clinch - Common Lisp 3D/2D Graphics Engine for OpenGL
ocaml - The core OCaml system: compilers, runtime system, base libraries
legit - CL interface to the GIT binary.
clog - CLOG - The Common Lisp Omnificent GUI