EARLY LOW QUALITY DRAFT
CIEL Is an Extended Lisp
Packages:
ciel-user
generic-ciel
: uses generic-cl instead ofcl
(todo)
Common Lisp, batteries included.
- settle on libraries that help newcomers
- automate the documentation
- distribute (Quicklisp, Qlot, Quicklisp distribution, Ultralisp, Ultralisp distribution (upcoming)…)
- ship a binary
- optionnal: create a tool that, given a CIEL code base, explains what packages to import in order to switch to “plain CL”.
How to procede ?
This is an experiment. I’d be happy to give push rights to more maintainers. We will send pull requests, discuss, and in case we don’t find a consensus for what should be on by default, we can create other packages.
Rules
- don’t install libraries that need a Slime helper to work in the REPL (cl-annot).
- reader syntax changes may not be enabled by default.
Clone, load the .asd, (ql:quickload "ciel")
and (in-package :ciel-user)
.
CIEL is on Ultralisp.
https://github.com/AccelerationNet/access/
It’s always
(access my-structure :elt)
We import functions from Serapeum. https://github.com/ruricolist/serapeum/blob/master/REFERENCE.md#hash-tables
https://github.com/ruricolist/serapeum/blob/master/REFERENCE.md#sequences
Available with the str
prefix.
https://github.com/vindarel/cl-str/
Mito and SxQL
https://lispcookbook.github.io/cl-cookbook/databases.html
Use Trivia, also available with the match
local nickname.
https://github.com/soemraws/parse-float
https://github.com/sharplispers/parse-number
https://github.com/tlikonen/cl-decimals
The main interface are the functions parse-decimal-number
and
format-decimal-number
. The former is for parsing strings for decimal
numbers and the latter for pretty-printing them as strings.
Reading:
DECIMALS> (parse-decimal-number "0.24")
6/25
DECIMALS> (parse-decimal-number "−12,345"
:decimal-separator #\,
:negative-sign #\−)
-2469/200
Parsing:
DECIMALS> (format-decimal-number -100/6 :round-magnitude -3)
"-16.667"
("-" "16" "." "667")
DECIMALS> (loop for e from -5 upto 5
do (print (format-decimal-number
(expt 10 e) :round-magnitude -5
:decimal-separator ","
:integer-minimum-width 7
:integer-group-separator " "
:fractional-minimum-width 7
:fractional-group-separator " ")))
" 0,000 01"
" 0,000 1 "
" 0,001 "
" 0,01 "
" 0,1 "
" 1 "
" 10 "
" 100 "
" 1 000 "
" 10 000 "
"100 000 "
NIL
Use ppcre
.
Bordeaux-Threads (bt
prefix)
Lparallel
Moira: https://github.com/ruricolist/moira (monitor and restart background threads)
http://quickdocs.org/trivial-monitored-thread/
Trivial Monitored Thread offers a very simple (aka trivial) way of spawning threads and being informed when one any of them crash and die.
cl-cron http://quickdocs.org/cl-cron/api
Imported:
- Hunchentoot
- Easy-routes
- Djula
- Spinneret
- Quri
https://lispcookbook.github.io/cl-cookbook/web.html
https://github.com/smithzvk/pythonic-string-reader
We can use triple quotes for docstrings, and double quotes within them.
(defun foo ()
"""foo "bar"."""
t)
You have to enable cl-punch’s syntax yourself.
https://github.com/windymelt/cl-punch/ - Scala-like anonymous lambda literal.
(cl-punch:enable-punch-syntax)
;; ^() is converted into (lambda ...) .
;; Each underscore is converted into a lambda argument.
(mapcar ^(* 2 _) '(1 2 3 4 5))
;; => '(2 4 6 8 10)
;; One underscore corresponds one argument.
(^(* _ _) 2 3)
;; => 6
;; <_ reuses last argument.
(mapcar ^(if (oddp _) (* 2 <_) <_) '(1 2 3 4 5))
;; => '(2 2 6 4 10)
;; _! corresponds one argument but it is brought to top of the argument list.
;; It can be useful when you want to change argument order.
(^(cons _ _!) :a :b)
;; => (:b . :a)
(^(list _! _! _!) 1 2 3)
;; => '(3 2 1)
https://github.com/sharplispers/log4cl/
(log:info …)
(repl-utilities:readme repl-utilities)
https://github.com/danlentz/printv
(:printv
(defvar *y*)
(defparameter *x* 2)
(setf *y* (sqrt *x*))
(setf *y* (/ 1 *y*)))
;; This produces the following text to PRINTV's output stream, and still results in the same returned value: 0.70710677.
;;; (DEFVAR *Y*) => *Y*
;;; (DEFPARAMETER *X* 2) => *X*
;;; (SETF *Y* (SQRT *X*)) => 1.4142135
;;; (SETF *Y* (/ 1 *Y*)) => 0.70710677
https://github.com/Shinmera/trivial-arguments
(defun foo (a b c &optional d) nil)
(arglist #'foo)
;; (a b c &optional d)
https://github.com/alex-gutev/generic-cl/
todo:
generic-ciel
Example:
;; with a struct or class "point":
(defmethod equalp ((p1 point) (p2 point))
(…))
That was your life in CL:
and now: