subtree(users/wpcarro): docking briefcase at '24f5a642'

git-subtree-dir: users/wpcarro
git-subtree-mainline: 464bbcb15c
git-subtree-split: 24f5a642af
Change-Id: I6105b3762b79126b3488359c95978cadb3efa789
This commit is contained in:
Vincent Ambo 2021-12-14 01:51:19 +03:00
commit 019f8fd211
766 changed files with 175420 additions and 0 deletions

View file

@ -0,0 +1,16 @@
# Common Lisp
Things that I like about Common Lisp:
- It's an S-expression based language.
- It has a powerful macro system
- It has a unique way of handling-errors
- It is highly introspectible
- The tooling integration with Emacs is the best I have ever seen for any language
Things that I don't like about Common Lisp:
- I find its standard libraries difficult to use and -- compared to modern
libraries -- like Golang's or Elixir's standard libraries, Common Lisp's
libraries are clunky
As such, I would like to modernize CL's libraries to resemble other libraries
with which I am more familiar and, therefore, productive.

View file

@ -0,0 +1,5 @@
# f.lisp
In this project, I'm attempting to port the Elisp library [`f.el`][1] to Common Lisp.
[1]: https://github.com/rejeep/f.el

View file

@ -0,0 +1,11 @@
{ depot, briefcase, ... }:
depot.nix.buildLisp.library {
name = "f";
deps = with briefcase.lisp; [
prelude
];
srcs = [
./main.lisp
];
}

View file

@ -0,0 +1,48 @@
(in-package #:cl-user)
(defpackage #:main
(:documentation "Modern API for working with files and directories.")
(:use #:cl)
(:shadow #:type))
(in-package #:main)
;; Common Lisp distinguishes between `namestrings` and `pathnames` as two types
;; of filename representations.
;;
;; A `pathname` is a structured representation of the name of a file, which
;; consists of six parts:
;; 1. host
;; 2. device
;; 3. directory
;; 4. name
;; 5. type
;; 6. version
;; TODO: Should I be using `string` as a type or `namestring`?
(defmacro type (name in out)
`(declaim (ftype (function ,in ,out) ,name)))
(type join (&rest namestring) pathname)
(defun join (&rest args)
"Join ARGS to a single path."
(apply #'merge-pathnames args))
(type ext (pathname) string)
(defun ext (path)
"Return the file extension of PATH."
(pathname-type path))
;; TODO: Define these tests elsewhere.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Tests
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; join
(string= (join "path") "path")
(string= (join "path" "to") "path/to")
(string= (join "/" "path" "to" "heaven") "/path/to/heaven")
;; ext
(string= (ext #p"path/to/file.ext") "ext")
(string= (ext #p"path/to/directory") nil)

View file

@ -0,0 +1,14 @@
(in-package #:cl-user)
(defpackage #:prelude
(:documentation "Supporting miscellaneous utility functions and macros.")
(:use #:cl)
(:shadow #:type)
(:export #:type #:comment))
(in-package #:prelude)
;; TODO: Add documentation to these macros.
(defmacro type (name in out)
`(declaim (ftype (function ,in ,out) ,name)))
(defmacro comment (&rest _forms) nil)

View file

@ -0,0 +1,8 @@
{ depot, ... }:
depot.nix.buildLisp.library {
name = "prelude";
srcs = [
./prelude.lisp
];
}