guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: guile-json: simple alist to json


From: Jan Nieuwenhuizen
Subject: Re: guile-json: simple alist to json
Date: Tue, 23 Feb 2016 21:09:12 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Aleix Conchillo Flaqué writes:

Hi Aleix,

> thanks for the patch! I have tried with guile 2.0.11 and it's giving me th
> ​e error at the end. I had zero time to fix it, but I believe it's 
> complaining because of this:
>
> scheme@(guile-user)> (symbol 'a)
> ERROR: In procedure string:
> ERROR: In procedure string: Wrong type (expecting character): a
>
> ​"a" is already a symbol.

Ouch.  Yes, I get that too...

I have been running this for quite some time but aparrently I prepared
patches and sent untested, "cleaned-up" code.  Sorry.

Please find a new patch set attached.

Greetings,
Jan

>From 518feb262370855550a3af61eafa650f3452ac24 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <address@hidden>
Date: Wed, 5 Aug 2015 08:21:13 +0200
Subject: [PATCH 1/2] builder: convert symbols to string.

* json/builder.scm (->string): New function.
* json/builder.scm (json-build-string): Use it.
---
 json/builder.scm | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/json/builder.scm b/json/builder.scm
index c725b19..f12dee8 100644
--- a/json/builder.scm
+++ b/json/builder.scm
@@ -1,6 +1,7 @@
 ;;; (json builder) --- Guile JSON implementation.
 
 ;; Copyright (C) 2013 Aleix Conchillo Flaque <address@hidden>
+;; Copyright (C) 2015 Jan Nieuwenhuizen <address@hidden>
 ;;
 ;; This file is part of guile-json.
 ;;
@@ -105,6 +106,12 @@
       (display (number->string (exact->inexact scm)) port)
       (display (number->string scm) port)))
 
+(define (->string x)
+  (cond ((char? x) (make-string 1 x))
+        ((number? x) (number->string x))
+        ((symbol? x) (symbol->string x))
+        (else x)))
+
 (define (json-build-string scm port escape)
   (display "\"" port)
   (display
@@ -121,7 +128,7 @@
                      ((#\ht) '(#\\ #\t))
                      ((#\/) (if escape `(#\\ ,c) (list c)))
                      (else (string->list (build-char-string c)))))
-                 (string->list scm))))
+                 (string->list (->string scm)))))
    port)
   (display "\"" port))
 
@@ -155,6 +162,7 @@
    ((eq? scm #nil) (json-build-null port))
    ((boolean? scm) (json-build-boolean scm port))
    ((number? scm) (json-build-number scm port))
+   ((symbol? scm) (json-build-string (symbol->string scm) port escape))
    ((string? scm) (json-build-string scm port escape))
    ((list? scm) (json-build-array scm port escape pretty level))
    ((hash-table? scm) (json-build-object scm port escape pretty level))
-- 
2.6.3

>From d45b1be0805bdabef65d9f8edad122ee5e9f07e0 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <address@hidden>
Date: Sat, 13 Feb 2016 21:16:46 +0100
Subject: [PATCH 2/2] builder: build objects from alists.

* json/builder.scm (atom?): New function.
* json/builder.scm (json-alist?): New function.
* json/builder.scm (json-build-object): SCM is an alist.
* json/builder.scm (json-build): Use it to support building objects from both
  hash-tables and alists.
---
 json/builder.scm | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/json/builder.scm b/json/builder.scm
index f12dee8..e1339b2 100644
--- a/json/builder.scm
+++ b/json/builder.scm
@@ -1,7 +1,7 @@
 ;;; (json builder) --- Guile JSON implementation.
 
 ;; Copyright (C) 2013 Aleix Conchillo Flaque <address@hidden>
-;; Copyright (C) 2015 Jan Nieuwenhuizen <address@hidden>
+;; Copyright (C) 2015,2016 Jan Nieuwenhuizen <address@hidden>
 ;;
 ;; This file is part of guile-json.
 ;;
@@ -112,6 +112,17 @@
         ((symbol? x) (symbol->string x))
         (else x)))
 
+(define (atom? x)
+  (or (char? x) (number? x) (string? x) (symbol? x)))
+
+(define (json-alist? x)
+  (and (pair? x)
+       (let loop ((x x))
+         (or (null? x)
+             (null? (car x))
+             (and (pair? (car x)) (atom? (caar x))
+                  (loop (cdr x)))))))
+
 (define (json-build-string scm port escape)
   (display "\"" port)
   (display
@@ -146,7 +157,7 @@
   (build-newline port pretty)
   (simple-format port "~A{" (indent-string pretty level))
   (build-newline port pretty)
-  (let ((pairs (hash-map->list cons scm)))
+  (let ((pairs scm))
     (unless (null? pairs)
       (build-object-pair (car pairs) port escape pretty (+ level 1))
       (for-each (lambda (p)
@@ -164,8 +175,10 @@
    ((number? scm) (json-build-number scm port))
    ((symbol? scm) (json-build-string (symbol->string scm) port escape))
    ((string? scm) (json-build-string scm port escape))
+   ((json-alist? scm) (json-build-object scm port escape pretty level))
    ((list? scm) (json-build-array scm port escape pretty level))
-   ((hash-table? scm) (json-build-object scm port escape pretty level))
+   ((hash-table? scm)
+    (json-build-object (hash-map->list cons scm) port escape pretty level))
    (else (throw 'json-invalid))))
 
 ;;
-- 
2.6.3


-- 
Jan Nieuwenhuizen <address@hidden> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | Avatar®  http://AvatarAcademy.nl  

reply via email to

[Prev in Thread] Current Thread [Next in Thread]