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…
	
	Add table
		Add a link
		
	
		Reference in a new issue