From c12a766e1920e726129dfd1161a2ef15471f89e8 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Thu, 3 Mar 2022 01:08:16 -0800 Subject: Lispify the MPD query Write a small DSL for converting a simple lisp expression to an MPD query format. This turns, for example: (and (= artist "Katatonia") (= album "Last Fair Deal Gone Down")) Into: ((artist == "Katatonia") AND (album == "Last Fair Deal Gone Down")) The expressions inside ‘query’ are quasi-quoted, so that variable substitution is possible. --- mpd.scm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 mpd.scm (limited to 'mpd.scm') diff --git a/mpd.scm b/mpd.scm new file mode 100644 index 0000000..74d297b --- /dev/null +++ b/mpd.scm @@ -0,0 +1,22 @@ +(define-structure mpd (export query) + (open scheme-with-scsh) + (begin + (define-syntax query + (syntax-rules () + ((_ a) + (mpd-query-1 `a)))) + + (define (mpd-query-equals params) + (apply format #f "~s == ~s" params)) + + (define (mpd-query-and params) + (format #f "~a AND ~a" + (mpd-query-1 (car params)) + (mpd-query-1 (cadr params)))) + + (define (mpd-query-1 query) + (format #f "(~a)" + (let ((op (car query))) + (case op + ('= (mpd-query-equals (cdr query))) + ('and (mpd-query-and (cdr query))))))))) -- cgit v1.2.3-54-g00ecf