Start working on f.lisp

I would like to port the `f.el` library to Common Lisp. I'm adding a README,
some build files, and the module itself to get started.
This commit is contained in:
William Carroll 2020-01-24 10:55:04 +00:00
parent e2e59c63e7
commit 143fc97032
3 changed files with 68 additions and 0 deletions

5
lisp/f/README.md Normal file
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

15
lisp/f/default.nix Normal file
View file

@ -0,0 +1,15 @@
{
depot ? import <depot> {},
universe ? import <universe> {},
...
}:
depot.nix.buildLisp.library {
name = "f";
deps = with universe.lisp; [
prelude
];
srcs = [
./main.lisp
];
}

48
lisp/f/main.lisp Normal file
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)