#+TITLE: LISP-FSRS
[[https://melpa.org/#/fsrs][file:https://melpa.org/packages/fsrs-badge.svg]]
Implementation of the FSRS algorithm in Common Lisp and auto-transpiled to Emacs Lisp.
- Usage ** Common Lisp #+BEGIN_SRC lisp CL-USER> (ql:quickload :lisp-fsrs) ; Ensure you have cloned this repository into the `local-projects' directory under your Quicklisp installation root. To load "lisp-fsrs": Load 1 ASDF system: lisp-fsrs ; Loading "lisp-fsrs" (:LISP-FSRS) CL-USER> (defparameter parameters (coerce '(0.2172 1.1771 3.2602 16.1507 7.0114 0.57 2.0966 0.0069 1.5261 0.112 1.0178 1.849 0.1133 0.3127 2.2934 0.2191 3.0004 0.7536 0.3332 0.1437 0.2) 'fsrs:parameters)) ,PARAMETERS CL-USER> (defparameter scheduler (fsrs:make-scheduler :parameters parameters)) ,SCHEDULER CL-USER> (defparameter card (fsrs:make-card)) ,CARD CL-USER> card #S(LISP-FSRS:CARD :CARD-ID 0 :STATE :LEARNING :STEP 0 :STABILITY NIL :DIFFICULTY NIL :DUE @2025-06-08T13:39:42.230941+08:00 :LAST-REVIEW NIL) CL-USER> (setf card (fsrs:scheduler-review-card scheduler card :good)) #S(LISP-FSRS:CARD :CARD-ID 0 :STATE :LEARNING :STEP 1 :STABILITY 3.2602 :DIFFICULTY 4.884632 :DUE @2025-06-08T13:49:49.476969+08:00 :LAST-REVIEW @2025-06-08T13:39:49.476969+08:00) CL-USER> (setf card (fsrs:scheduler-review-card scheduler card :good)) #S(LISP-FSRS:CARD :CARD-ID 0 :STATE :REVIEW :STEP NIL :STABILITY 3.5362437 :DIFFICULTY 4.8680573 :DUE @2025-06-12T13:39:50.242969+08:00 :LAST-REVIEW @2025-06-08T13:39:50.242969+08:00) #+END_SRC
To generate the fsrs package for Emacs after changing the code, ensure
you are running the current Lisp session using sly in Emacs, then:
#+BEGIN_SRC lisp CL-USER> (ql:quickload :lisp-fsrs/emacs) To load "lisp-fsrs/emacs": Load 1 ASDF system: lisp-fsrs/emacs ; Loading "lisp-fsrs/emacs" [package lisp-fsrs.emacs].. (:LISP-FSRS/EMACS) CL-USER> (fsrs.emacs:translate-system) NIL #+END_SRC ** Emacs Lisp #+BEGIN_SRC emacs-lisp ELISP> (package-vc-install "https://github.com/open-spaced-repetition/lisp-fsrs.git") t ELISP> (setq fsrs-parameters [0.2172 1.1771 3.2602 16.1507 7.0114 0.57 2.0966 0.0069 1.5261 0.112 1.0178 1.849 0.1133 0.3127 2.2934 0.2191 3.0004 0.7536 0.3332 0.1437 0.2]) [0.2172 1.1771 3.2602 16.1507 7.0114 0.57 2.0966 0.0069 1.5261 0.112 1.0178 1.849 0.1133 0.3127 2.2934 0.2191 3.0004 0.7536 0.3332 0.1437 0.2]
ELISP> (setq fsrs-scheduler (fsrs-make-scheduler)) #s(fsrs-scheduler :parameters [0.2172 1.1771 3.2602 16.1507 7.0114 0.57 2.0966 0.0069 1.5261 0.112 1.0178 1.849 0.1133 0.3127 2.2934 0.2191 3.0004 0.7536 0.3332 0.1437 0.2] :desired-retention 0.9 :learning-steps ((1 :minute) (10 :minute)) :relearning-steps ((10 :minute)) :maximum-interval (36500 :day) :enable-fuzzing-p t)
ELISP> (setq fsrs-card (fsrs-make-card)) #s(fsrs-card :card-id 0 :state :learning :step 0 :stability nil :difficulty nil :due "2025-06-08T05:38:50Z" :last-review nil)
ELISP> (setq fsrs-card (cl-nth-value 0 (fsrs-scheduler-review-card fsrs-scheduler fsrs-card :good))) #s(fsrs-card :card-id 0 :state :learning :step 1 :stability 3.2602 :difficulty 4.884631634813845 :due "2025-06-08T05:48:52Z" :last-review "2025-06-08T05:38:52Z")
ELISP> (setq fsrs-card (cl-nth-value 0 (fsrs-scheduler-review-card fsrs-scheduler fsrs-card :good))) #s(fsrs-card :card-id 0 :state :review :step nil :stability 3.536243655619573 :difficulty 4.868056502338024 :due "2025-06-10T05:38:53Z" :last-review "2025-06-08T05:38:53Z") #+END_SRC