Welcome to my website, the one true source of reliable curated information about me and my activities.
?- likes('Eshel', Stuff). Stuff = 'logic programming'; Stuff = 'linguistics'; Stuff = 'cognition'; Stuff = 'functional programming'; Stuff = 'The cyber'; Stuff = 'type systems'; Stuff = 'coffee ☕️'; Stuff = 'free software'.
sweep: SWI-Prolog Embedded in Emacs
sweep is an Emacs module which uses the C interfaces of both SWI-Prolog and Emacs to bring the two together into one address space.
For more details, see the
Sourcehut GraphQL client for SWI-Prolog
sourcehut.pl - a SWI-Prolog package for interacting with the GraphQL API of sourcehut instances.
sourcehut.pl can be used to automate maintenance tasks for project
hosted on sourcehut, for example to attach a build artifact to a given
tag of a git repository from within SWI-Prolog:
?- sourcehut_git_repository("eshel", "sourcehut.pl", Repo, ), get_dict(id, Repo, RepoId), sourcehut_git_upload_artifact(RepoId, "v0.1.2", "/tmp/foo/baz.txt", Artifact, ).
GNU Emacs literate configuration
My personal configuration for GNU Emacs, written in as a Literate
Babel. An online version is also
published as an HTML webpage on this website.
SWI-Prolog Debug Adapter Protocol Server
An implementation of the Debug Adapter Protocol (DAP) for SWI-Prolog, facilitating an advanced debugging experience for Prolog from the comfort of GNU Emacs (and other editors, as well).
A Scheme Lisp interpreter implemented in SWI-Prolog.
$ cat scheme/repl.scm (define repl () (write (eval (read))) (repl)) (repl) $ ./eshellisp scheme/repl.scm % (cons (+ 1 2) 4) % (3 . 4)
flymake-swi-prolog.el and diagnostics.pl
diagnostics.pl is a SWI-Prolog package implementing a simple and
extensible inteface for diagnosing issues with SWI-Prolog source code,
exposing by default the powerful analysis used by the built-in
flymake-swi-prolog is an Emacs Lisp package implementing a Flymake
backend that leverages
diagnostics.pl to provide diagnostics for
SWI-Prolog source code in
prolog-mode Emacs buffers.
A (SWI-)Prolog implemantation of the rope data structure for efficient massive string editing.
Based on Ropes: An alternative to strings.
test(edit) :- string_rope("Hello, World!" , HW), string_rope("Here be dragons", HD), rope_split(HD, 8, _, D), % "Here be " + "dragons" rope_split(HW, 7, H, W), % "Hello, " + "World!" rope_split(W , 5, _, E), % "World" + "!" rope_concat(H , D, HS), rope_concat(HS, E, HE), rope_string(HE, HF), assertion(HF == "Hello, dragons!").
Erlang eBPF library
A low level interface to the Linux eBPF system for Erlang.
My first taste of web development, a practice that I have always refrained from conducting. Created with pure org-mode to ease the landing.