Skip to main content

No project description provided

Project description

PyPI CI

A Port of the Clojure Pretty Print Library to Basilisp

Basilisp is a Python-based Lisp implementation that offers broad compatibility with Clojure. For more details, check out the documentation.

Overview

basilisp-pprint is a source code port of the clojure.pprint core library to Basilisp.

The clojure.pprint library provides pretty formatting capabilities for common Clojure data structures such as lists, maps, sets, vectors, as well as Clojure code. The library allows for customizable printing through various options and parameters.

basilisp-pprint provides these capabilities to Basilisp as an external library, allowing you to use it while the native basilisp.pprint support (note the dot in the name) is still in development. This includes enhanced API features, such as the cl-format function.

Installation

To install basilisp-pprint, run:

pip install basilisp-pprint

Usage

To use the library, require it as basilisp-pprint.pprint in your Basilisp code.

For general usage instructions, refer to the clojure.pprint documentation.

Examples

Pretty Printing a Nested Map

;; https://clojuredocs.org/clojure.pprint/pprint#example-542692d0c026201cdc326ec5
(require '[basilisp-pprint.pprint :as p])

(def big-map (zipmap
              [:a :b :c :d :e]
              (repeat
               (zipmap [:a :b :c :d :e]
                       (take 5 (range))))))
;; => #'user/big-map

big-map
;; => {:e {:e 4 :a 0 :c 2 :d 3 :b 1} :a {:e 4 :a 0 :c 2 :d 3 :b 1} :c {:e 4 :a 0 :c 2 :d 3 :b 1} :d {:e 4 :a 0 :c 2 :d 3 :b 1} :b {:e 4 :a 0 :c 2 :d 3 :b 1}}

(p/pprint big-map)
;; {:e {:e 4, :a 0, :c 2, :d 3, :b 1},
;;  :a {:e 4, :a 0, :c 2, :d 3, :b 1},
;;  :c {:e 4, :a 0, :c 2, :d 3, :b 1},
;;  :d {:e 4, :a 0, :c 2, :d 3, :b 1},
;;  :b {:e 4, :a 0, :c 2, :d 3, :b 1}}

Pretty Printing Clojure Code

;; https://clojuredocs.org/clojure.pprint/pprint#example-5b950e6ce4b00ac801ed9e8a
;;
;; get Clojure snippets to print nicely
(require '[basilisp-pprint.pprint :as p]
         'basilisp.edn)

(def lost-formatting
  "(defn op [sel] (condp = sel :plus + :minus - :mult *
   :div / :rem rem :quot quot :mod mod))")
;; => #'user/lost-formatting

(p/with-pprint-dispatch
  p/code-dispatch
  (p/pprint
   (basilisp.edn/read-string lost-formatting)))
;; (defn op [sel]
;;   (condp = sel
;;     :plus +
;;     :minus -
;;     :mult *
;;     :div /
;;     :rem rem
;;     :quot quot
;;     :mod mod))

Pretty Printing with Metadata

;; https://clojuredocs.org/clojure.pprint/pprint#example-6318f958e4b0b1e3652d765f
;;
;; pprint with metadata
(require '[basilisp-pprint.pprint :as p])

(binding [*print-meta* true]
  (p/pprint ^{:hello :world} {}))
;; ^{:hello :world} {}

Pretty Printing Tables

;; https://clojuredocs.org/clojure.pprint/print-table#example-542692d6c026201cdc3270f1
;;
;; If there are keys not in the first row, and/or you want to specify only
;; some, or in a particular order, give the desired keys as the first arg.
(require '[basilisp-pprint.pprint :as p])

(p/print-table [:b :a] [{:a 1 :b 2 :c 3} {:b 5 :a 7 :c "dog"}])
;; | :b | :a |
;; |----+----|
;; |  2 |  1 |
;; |  5 |  7 |

Using cl-format

;; cl-format example
(require '[basilisp-pprint.pprint :as p])

(let [name "Alice"
      born 1999
      hobbies ["reading" "hiking" "hacking"]]
  (-> (p/cl-format nil "Name: ~A~%Born: ~@R~%Hobbies: ~{~A~^, ~}~%"
                      name
                      born
                      hobbies)
      print))
;; Name: Alice
;; Born: MCMXCIX
;; Hobbies: reading, hiking, hacking

Development and Testing

The approach taken for this port was to make as few changes as possible to the original clojure.pprint source code in order to maintain consistency. While the current implementations is feature-complete and works quite well, it has not yet been fully optimized for Python.

To run the test suite, use the following command:

basilsp test

License

This project is licensed under the Eclipse Public License 1.0. See the LICENSE file for details.

Acknowledgments

@chrisrink10, for developing Basilisp and ensuring API compatibility with Clojure, enabling smooth ports of Clojure source code to Python.

;;; pprint.clj -- Pretty printer and Common Lisp compatible format function (cl-format) for Clojure

;   Copyright (c) Rich Hickey. All rights reserved.
;   The use and distribution terms for this software are covered by the
;   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;   which can be found in the file epl-v10.html at the root of this distribution.
;   By using this software in any fashion, you are agreeing to be bound by
;   the terms of this license.
;   You must not remove this notice, or any other, from this software.

;; Author: Tom Faulhaber
;; April 3, 2009
;;
;; Porting to Basilisp initiated from Clojure,
;; based on the code available at
;; https://github.com/clojure/clojure/blob/08a2d9bdd013143a87e50fa82e9740e2ab4ee2c2/src/clj/clojure/pprint.clj

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

basilisp_pprint-0.1.1.tar.gz (44.3 kB view details)

Uploaded Source

Built Distribution

basilisp_pprint-0.1.1-py3-none-any.whl (43.9 kB view details)

Uploaded Python 3

File details

Details for the file basilisp_pprint-0.1.1.tar.gz.

File metadata

  • Download URL: basilisp_pprint-0.1.1.tar.gz
  • Upload date:
  • Size: 44.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for basilisp_pprint-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4eaec74f135be0069965e6cfe917f2649511c7c0de45090a0702e828b77bdb9a
MD5 9dcdbf1a49445531f93b4057258a52a3
BLAKE2b-256 885605a77f3e59f1ae75a34ed313b65e2c00bd4c789522c80becd7034a8418cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for basilisp_pprint-0.1.1.tar.gz:

Publisher: release.yaml on ikappaki/basilisp-pprint

Attestations:

File details

Details for the file basilisp_pprint-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for basilisp_pprint-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5c599e0bf0d8f97d6c43ec9e337bd20ed5385d47345f36f71a3007d90d593f77
MD5 b2bd2e41917714901bc434186473b0d3
BLAKE2b-256 aa599d2ee3cc5519441943803d6d608ef04e2a8a67243440e10e84c7dbcaa33c

See more details on using hashes here.

Provenance

The following attestation bundles were made for basilisp_pprint-0.1.1-py3-none-any.whl:

Publisher: release.yaml on ikappaki/basilisp-pprint

Attestations:

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page