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:
parent
e2e59c63e7
commit
143fc97032
3 changed files with 68 additions and 0 deletions
5
lisp/f/README.md
Normal file
5
lisp/f/README.md
Normal 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
15
lisp/f/default.nix
Normal 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
48
lisp/f/main.lisp
Normal 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)
|
Loading…
Reference in a new issue