Add initial turtle producer

Julien LepillerSun Apr 05 16:22:11+0200 2020

1daea25

Add initial turtle producer

Makefile.am

77
  rdf/entailment/simple.scm \
88
  rdf/rdf.scm \
99
  rdf/xsd.scm \
10+
  turtle/fromrdf.scm \
1011
  turtle/parser.scm \
1112
  turtle/tordf.scm \
1213
  iri/iri.scm \

turtle/fromrdf.scm unknown status 1

1+
;;;; Copyright (C) 2020 Julien Lepiller <julien@lepiller.eu>
2+
;;;; 
3+
;;;; This library is free software; you can redistribute it and/or
4+
;;;; modify it under the terms of the GNU Lesser General Public
5+
;;;; License as published by the Free Software Foundation; either
6+
;;;; version 3 of the License, or (at your option) any later version.
7+
;;;; 
8+
;;;; This library is distributed in the hope that it will be useful,
9+
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11+
;;;; Lesser General Public License for more details.
12+
;;;; 
13+
;;;; You should have received a copy of the GNU Lesser General Public
14+
;;;; License along with this library; if not, write to the Free Software
15+
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16+
;;;; 
17+
18+
(define-module (turtle fromrdf)
19+
  #:use-module (ice-9 match)
20+
  #:use-module (ice-9 textual-ports)
21+
  #:use-module (iri iri)
22+
  #:use-module (turtle parser)
23+
  #:use-module (srfi srfi-9)
24+
  #:use-module (rdf rdf)
25+
  #:export (rdf->turtle))
26+
27+
(define (node->turtle node)
28+
  (cond
29+
    ((blank-node? node)
30+
     (string-append "_:" (number->string node)))
31+
    ((rdf-datatype? node)
32+
     (string-append "<" (car (rdf-datatype-iris node)) ">"))
33+
    ((rdf-literal? node)
34+
     (string-append "\"" (rdf-literal-lexical-form node) "\""
35+
                    (if (rdf-literal-langtag node)
36+
                        (string-append "@" (rdf-literal-langtag node))
37+
                        (let ((type (rdf-literal-type node)))
38+
                          (string-append
39+
                            "^^" (if (rdf-datatype? type)
40+
                                     (car (rdf-datatype-iris type))
41+
                                     type))))))
42+
    ((string? node)
43+
     (string-append "<" node ">"))))
44+
45+
(define (rdf->turtle g)
46+
  (string-join
47+
    (map
48+
      (match-lambda
49+
        (($ rdf-triple subject predicate object)
50+
         (format #f "~a ~a ~a ."
51+
                 (node->turtle subject)
52+
                 (node->turtle predicate)
53+
                 (node->turtle object))))
54+
      g)
55+
    "\n"))