From a7c418a1c02c74c837f7596b2ab90be722ae488d Mon Sep 17 00:00:00 2001 From: TakeV Date: Sun, 2 Jul 2023 22:09:26 -0700 Subject: [PATCH] Add initial bencode serialization --- guile-nrepl/bencode.scm | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 guile-nrepl/bencode.scm diff --git a/guile-nrepl/bencode.scm b/guile-nrepl/bencode.scm new file mode 100644 index 0000000..ed4d9cb --- /dev/null +++ b/guile-nrepl/bencode.scm @@ -0,0 +1,31 @@ +(define-module (guile-nrepl bencode) + #:use-module (ice-9 format) + #:export (string->bencode + integer->bencode + list->bencode + pair->bencode)) + +(define (string->bencode input-str) + (when (string? input-str) + (format #f "~d:~a" (string-length input-str) input-str))) + +(define (integer->bencode input-int) + (when (integer? input-int) + (format #f "i~de" input-int))) + +(define (list->bencode input-list) + (when (list? input-list) + (format #f "l~ae" (apply string-append (map bencode-encode-dispatch input-list))))) + +(define (pair->bencode input-pair) + (when (pair? input-pair) + (format #f "d~a~ae" + (bencode-encode-dispatch (car input-pair)) + (bencode-encode-dispatch (cdr input-pair))))) + +(define (bencode-encode-dispatch input-value) + (cond + ((string? input-value) (string->bencode input-value)) + ((integer? input-value) (integer->bencode input-value)) + ((list? input-value) (list->bencode input-value)) + ((pair? input-value) (pair->bencode input-value))))