Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/guicho271828/file-local-variable

File-local variable independent from ASDF
https://github.com/guicho271828/file-local-variable

Last synced: 29 days ago
JSON representation

File-local variable independent from ASDF

Awesome Lists containing this project

README

        

* File-Local-Variable - File-local variable independent from ASDF

[[https://circleci.com/gh/guicho271828/file-local-variable][https://circleci.com/gh/guicho271828/file-local-variable.svg?style=svg]]

Implements a file-local variable using a carefully designed file-reloading scheme.

#+BEGIN_SRC lisp

(defpackage file-local-variable.example
(:use :cl))

(in-package :file-local-variable.example)

(defun myhook (macrofn form env)
(print form)
(funcall macrofn form env))

(flv:file-local-bind *macroexpand-hook* 'myhook
*read-default-float-format* 'double-float)

(eval-when (:compile-toplevel) (print :compile-toplevel))
(eval-when (:load-toplevel) (print :load-toplevel))
(eval-when (:execute) (print :execute))

(eval-when (:compile-toplevel :load-toplevel :execute)
(print '#.*macroexpand-hook*) ; 'myhook
(print (type-of 3.0))) ; 'double-float

#+END_SRC

** syntax

The syntax is the same as =setf=.

: (file-local-bind var val &rest more)

** Related work

ASDF-FLV, but it depends on ASDF. by Didier Verna.

http://www.cliki.net/asdf-flv

CDR 9 proposal (File-local variables) by Didier Verna.

https://common-lisp.net/project/cdr/document/9/verna.11.cdr2.pdf

** How It Works

1. =flv:file-local-bind= dynamically binds the variable using =progv=, and
opens the current =*compile-pathanme*=. Within the dynamic environment
of =progv=, reread the file as follows:
1. Skip the forms until the first appearance of =flv:file-local-bind=.
2. Skip the =flv:file-local-bind= form.
3. Read, then macroexpands the rest of the forms. Currently it depends
on the implementation-specific =macroexpand-all=.
4. =flv:file-local-bind= expands into a =progn= containing their
expansion results.
2. Skips the rest of the forms by assigning =*dumb-readtable*= to
=*readtable*= , i.e., a readtable which treats all characters
as [[http://www.lispworks.com/documentation/HyperSpec/Body/02_ad.htm][whitespace characters]].
3. Since =*readtable*= is file-local as specified by ANSI, it is unbound when the file
compilation finishes.

** Dependencies

This library is at least tested on implementation listed below:

+ SBCL 1.3.2 on X86-64 Linux 3.19.0-49-generic (author's environment)

Also, it depends on the following libraries:

+ iterate by ::
Jonathan Amsterdam's iterator/gatherer/accumulator facility

+ alexandria by ::
Alexandria is a collection of portable public domain utilities.

+ trivia ::

** Installation

** Author

+ Masataro Asai ([email protected])

* Copyright

Copyright (c) 2016 Masataro Asai ([email protected])

* License

Licensed under the LLGPL License.