mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-23 23:33:00 +03:00
Merge pull request #1694 from jsyeo/feature-edn
[edn/en] Add a short tutorial for EDN
This commit is contained in:
commit
927ac9c3e8
108
edn.html.markdown
Normal file
108
edn.html.markdown
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
language: edn
|
||||||
|
filename: learnedn.edn
|
||||||
|
contributors:
|
||||||
|
- ["Jason Yeo", "https://github.com/jsyeo"]
|
||||||
|
---
|
||||||
|
|
||||||
|
Extensible Data Notation or EDN for short is a format for serializing data.
|
||||||
|
|
||||||
|
The notation is used internally by Clojure to represent programs and it also
|
||||||
|
used as a data transfer format like JSON. Though it is more commonly used in
|
||||||
|
Clojure land, there are implementations of EDN for many other languages.
|
||||||
|
|
||||||
|
The main benefit of EDN over JSON and YAML is that it is extensible, which we
|
||||||
|
will see how it is extended later on.
|
||||||
|
|
||||||
|
```Clojure
|
||||||
|
; Comments start with a semicolon.
|
||||||
|
; Anythng after the semicolon is ignored.
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;
|
||||||
|
;;; Basic Types ;;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
nil ; also known in other languages as null
|
||||||
|
|
||||||
|
; Booleans
|
||||||
|
true
|
||||||
|
false
|
||||||
|
|
||||||
|
; Strings are enclosed in double quotes
|
||||||
|
"hungarian breakfast"
|
||||||
|
"farmer's cheesy omelette"
|
||||||
|
|
||||||
|
; Characters are preceeded by backslashes
|
||||||
|
\g \r \a \c \e
|
||||||
|
|
||||||
|
; Keywords start with a colon. They behave like enums. Kind of
|
||||||
|
; like symbols in Ruby.
|
||||||
|
:eggs
|
||||||
|
:cheese
|
||||||
|
:olives
|
||||||
|
|
||||||
|
; Symbols are used to represent identifiers. They start with #.
|
||||||
|
; You can namespace symbols by using /. Whatever preceeds / is
|
||||||
|
; the namespace of the name.
|
||||||
|
#spoon
|
||||||
|
#kitchen/spoon ; not the same as #spoon
|
||||||
|
#kitchen/fork
|
||||||
|
#github/fork ; you can't eat with this
|
||||||
|
|
||||||
|
; Integers and floats
|
||||||
|
42
|
||||||
|
3.14159
|
||||||
|
|
||||||
|
; Lists are sequences of values
|
||||||
|
(:bun :beef-patty 9 "yum!")
|
||||||
|
|
||||||
|
; Vectors allow random access
|
||||||
|
[:gelato 1 2 -2]
|
||||||
|
|
||||||
|
; Maps are associative data structures that associates the key with its value
|
||||||
|
{:eggs 2
|
||||||
|
:lemon-juice 3.5
|
||||||
|
:butter 1}
|
||||||
|
|
||||||
|
; You're not restricted to using keywords as keys
|
||||||
|
{[1 2 3 4] "tell the people what she wore",
|
||||||
|
[5 6 7 8] "the more you see the more you hate"}
|
||||||
|
|
||||||
|
; You may use commas for readability. They are treated as whitespaces.
|
||||||
|
|
||||||
|
; Sets are collections that contain unique elements.
|
||||||
|
#{:a :b 88 "huat"}
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;;; Tagged Elements ;;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
; EDN can be extended by tagging elements with # symbols.
|
||||||
|
|
||||||
|
#MyYelpClone/MenuItem {:name "eggs-benedict" :rating 10}
|
||||||
|
|
||||||
|
; Let me explain this with a clojure example. Suppose I want to transform that
|
||||||
|
; piece of edn into a MenuItem record.
|
||||||
|
|
||||||
|
(defrecord MenuItem [name rating])
|
||||||
|
|
||||||
|
; To transform edn to clojure values, I will need to use the built in EDN
|
||||||
|
; reader, edn/read-string
|
||||||
|
|
||||||
|
(edn/read-string "{:eggs 2 :butter 1 :flour 5}")
|
||||||
|
; -> {:eggs 2 :butter 1 :flour 5}
|
||||||
|
|
||||||
|
; To transform tagged elements, define the reader function and pass a map
|
||||||
|
; that maps tags to reader functions to edn/read-string like so
|
||||||
|
|
||||||
|
(edn/read-string {:readers {'MyYelpClone/MenuItem map->menu-item}}
|
||||||
|
"#MyYelpClone/MenuItem {:name \"eggs-benedict\" :rating 10}")
|
||||||
|
; -> #user.MenuItem{:name "eggs-benedict", :rating 10}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# References
|
||||||
|
|
||||||
|
- [EDN spec](https://github.com/edn-format/edn)
|
||||||
|
- [Implementations](https://github.com/edn-format/edn/wiki/Implementations)
|
||||||
|
- [Tagged Elements](http://www.compoundtheory.com/clojure-edn-walkthrough/)
|
Loading…
Reference in New Issue
Block a user