[HN Gopher] YAML: It's Time to Move On
       ___________________________________________________________________
        
       YAML: It's Time to Move On
        
       Author : firearm-halter
       Score  : 96 points
       Date   : 2021-11-14 20:25 UTC (2 hours ago)
        
 (HTM) web link (nestedtext.org)
 (TXT) w3m dump (nestedtext.org)
        
       | Waterluvian wrote:
       | My opinion only: I love JSON because it lacks so many foot guns
       | of yaml. If you're doing lots of clever stuff with yaml you
       | probably want a scripting language instead. Django using Python
       | for configs made me fall in love with this. Spending years with
       | the unmitigated disaster that is ROS xml launchfiles and
       | rosparams makes me love it even more.
       | 
       | Yaml and toml are fine if you keep it simple. JSON direly needs
       | comments support (but of course wasn't designed to be used as a
       | human config file format so that's kind of on us). And not just
       | "Jsonc that sometimes might work in places."
       | 
       | Beyond that, I think we generally have all the things we need and
       | I don't personally think we need yet another yaml. =)
        
         | dmitriid wrote:
         | > My opinion only: I love JSON because it lacks so many foot
         | guns of yaml.
         | 
         | While true, parsing it is still a minefield because it's very
         | underspecified: http://seriot.ch/projects/parsing_json.html
        
         | BugsJustFindMe wrote:
         | > _Django using Python for configs made me fall in love with
         | this._
         | 
         | I also started advocating in-language configuration files
         | (Python for Python, but also Lua for Lua, etc) a number of
         | years ago because it lets you do really useful things (like
         | functionally generating values, importing shared subsets of
         | data, storing executable references, and ensuring that two keys
         | return the same values without manual copy/paste) all without
         | needing to spec and use Yet Another Thing(tm) that does only a
         | fraction of what the programming language you're already using
         | already does.
        
           | eptcyka wrote:
           | That also implies that you can't just test a foreign config
           | file without first reading and understanding what it does, as
           | just using one would imply arbitrary code execution.
        
             | kevin_thibedeau wrote:
             | This is a place where Tcl excels. You can easily create
             | restricted sub-interpreters that can't do anything
             | dangerous. If you need more power for trusted scripts you
             | just reenable selected commands.
        
               | spacechild1 wrote:
               | Same thing with with Lua!
        
           | Jnr wrote:
           | Using the programming language to do the comments works only
           | when using some scripting language.
           | 
           | Things that get compiled can't really use it without
           | recompilation.
        
           | pjmlp wrote:
           | That is how our Tcl based application server was, the
           | configuration files were a Tcl DSL.
        
         | woodruffw wrote:
         | These aren't foot-guns per se, but I can think of another
         | handful of grievances I have with JSON:
         | 
         | * JSON streaming is a bit of a mess. You can either do JSONL,
         | or keep the entire document in memory at once. I usually end up
         | going with JSONL.
         | 
         | * JSON itself doesn't permit trailing commas. I can measure the
         | amount of time that I've wasted re-opening JSON files after
         | accidentally adding a comma in _days_ , not hours.
         | 
         | * JSON has weakly specified numbers. The specification itself
         | defines the number type symbolically, as (essentially)
         | `[0-9]+`. It's consequently possible (and common) for different
         | parsers to behave differently on large numbers. YAML also,
         | unfortunately, has this problem.
         | 
         | * Similarly: JSON doesn't clearly specify how parsers should
         | behave in the presence of duplicate keys. More opportunity for
         | confusion and bugs.
        
           | spullara wrote:
           | You can parse JSON in a streaming fashion with many
           | libraries. You just don't know at the beginning if it is
           | going to be valid or not.
        
             | lkschubert8 wrote:
             | And the flip side of that with YAML is you can stream it,
             | but you don't know once you've gotten to the end if it was
             | the whole document without some user defined checksum
             | mechanism.
        
           | secondcoming wrote:
           | 2, 3 and 4 can be caught early with JSON schema.
        
             | mirekrusin wrote:
             | Not really, json schema validation is applied after json
             | parsing on already parsed json.
        
           | xorcist wrote:
           | How someone could have decided on a subset of javascript and
           | not include comments is beyond me.
        
           | afiori wrote:
           | the funny thing is that json doesn't even need commas _, they
           | essentially act as whitespace, any amount or no amount would
           | make no difference in the meaning of the document.
           | 
           | _ Arrays with hole are a JS-only feature
        
           | jrockway wrote:
           | Running prettier (https://prettier.io) on each save will fix
           | trailing commas for you. If you accidentally have one, it
           | will just sneakily remove it and turn your document into one
           | that is valid.
        
         | timmytokyo wrote:
         | JSON5 is the way to go. It supports comments and trailing
         | commas. Unfortunately it's going to be difficult to supplant
         | legacy JSON, which is so pervasive.
        
           | dheera wrote:
           | Except parsing JSON5 in browser is super slow. Native
           | JSON.Parse doesn't support it, non-native parsnips are slow,
           | and the only fast way to parse it is `eval()`.
        
             | TheCondor wrote:
             | Does the browser need JSON objects with comments?
             | 
             | The desire to use a single interchange format for all data
             | is the problem. There are plenty of reasons to support
             | comments and minor syntax issues that JSON itself dislikes
             | for human consumable and interactive JSON. I'd think
             | software JSON could be just that.
        
             | The_Colonel wrote:
             | This shouldn't really matter for the JSON5 use case -
             | config files - which are usually small enough.
             | 
             | For machine-to-machine generated payloads JSON is good
             | enough.
        
         | gmadsen wrote:
         | I work with ros extensively and have not heard of using django
         | for this use case. do you know of any open source projects that
         | do this?
        
       | mongol wrote:
       | There was an interesting project showcased here a while ago, it
       | was some kind of very minimal language, almost the most minimal
       | theoretically possible, but with some interesting properties.
       | Does anyone remember it?
        
         | kps wrote:
         | I can't tell whether you're making a LISP joke.
        
           | mongol wrote:
           | Actually not.
        
       | account-5 wrote:
       | I like INI. It's simple it's readable and it leaves the data
       | types up to the application to interpret. It's also really easy
       | to parse, I can work out how to do it and JSON is beyond me.
       | 
       | I like CSV (and similar delimited files) it's less verbose than
       | anything else for tabular data.
       | 
       | I like JSON for data transfer, you know the data types, it's
       | succinct, and readable.
       | 
       | I personally don't need anything else.
        
         | zz865 wrote:
         | INI is my favorite. I dont understand why it isn't the
         | automatic default for everything.
        
         | aspaceman wrote:
         | This is the right answer in my view. If you need something
         | structured use XML, otherwise INI.
         | 
         | I'm more likely to Yacc my own config format than use YAML or
         | JSON personally.
         | 
         | JSON is great as an output format for data though.
        
       | midasuni wrote:
       | Not a fan of Yaml. An ini file (no space problems) for simple
       | config, json for more complex structure, csv for multiple entries
       | with the same fields
        
       | morelisp wrote:
       | The introduction keeps citing "no need for escaping or quoting"
       | as a major advantage, but provides no examples of what a key with
       | a colon, or value beginning with "[", or any datum with leading
       | or trailing whitespace would look like.
       | 
       | Also, the changelog is quite frightening!
       | 
       | > [In 3.0], `[ ]` now represents a list that contains an empty
       | string, whereas previously it represented an empty list.
        
         | matzf wrote:
         | This made my curious to find out. The "Language introduction"
         | docs [1] answers these points;
         | 
         | * keys containing leading spaces, newlines or colons can be
         | represented with the multiline key form, where each line of the
         | key starts with `: `.
         | 
         | * leading or trailing space is not complicated; the string
         | values are just the rest of the line after the separator from
         | the key, `: `. The values are not trimmed.
         | 
         | * a string value beginning with `[` just works in most places.
         | This would not be confused with list values, as these would
         | only start after a new line. Only in the compact inline list
         | and inline dict form there are restricted characters for
         | syntax.
         | 
         | It seems that their claim, no escaping required, holds. The
         | slightly more verbose form of the language constructs may be
         | required to represent special values though.
         | 
         | [1]: https://nestedtext.org/en/stable/basic_syntax.html
        
       | georgewfraser wrote:
       | A radically different alternative with a lot going for it is
       | Starlark: https://github.com/bazelbuild/starlark
       | 
       | It's a deterministic subset of Python. This means that if you
       | have complex or repetitive configurations, you can use loops and
       | functions to structure them. But it's impossible to write an
       | infinite loop or recursion.
        
         | remram wrote:
         | Interesting! I started using jsonnet this year, but found that
         | the language was needlessly quirky (e.g. the `::`, purely
         | functional aspect, and no one wants to learn a new language to
         | write configuration in the first place). More importantly, it
         | is extremely slow (lazy evaluation without memoization...):
         | rendering the Kubernetes YAML of my 5-container app taking over
         | 10 seconds...
         | 
         | I will look into this further.
        
         | xiaq wrote:
         | > It's a deterministic subset of Python. This means that if you
         | have complex or repetitive configurations, you can use loops
         | and functions to structure them. But it's impossible to write
         | an infinite loop or recursion.
         | 
         | Starlark is indeed deterministic and guaranteed to terminate
         | (the Go implementation has a flag that allows recursion, but
         | it's off by default), but these are two orthogonal properties.
        
         | vlovich123 wrote:
         | Have you had any experience building on top of it directly
         | outside of blaze/bazel?
        
           | dilyevsky wrote:
           | I have - https://github.com/cruise-automation/isopod and more
           | generally with https://github.com/stripe/skycfg
        
         | civilized wrote:
         | Not a bad idea but only implemented in Rust, Go, and Java so
         | far. Meanwhile, all sorts of languages can interpret JSON and
         | YAML.
         | 
         | It's a cool idea to do configuration in a subset of Python but
         | now you have to go implement that subset in every language.
        
         | OskarS wrote:
         | > Starlark is a dialect of Python. Like Python, it is a
         | dynamically typed language with high-level data types, first-
         | class functions with lexical scope, and garbage collection.
         | 
         | If it has first-class functions, how can you avoid infinite
         | recursion? Like, what stops me from running the omega
         | combinator in it? This is why Meson (a similar language) does
         | not allow those kinds of shenanigans, to keep the language non-
         | Turing-complete.
        
           | georgewfraser wrote:
           | No recursion and no lambda.
        
         | slowmovintarget wrote:
         | EDN [1] and Transit [2]... Elegant weapons for a more civilized
         | system.
         | 
         | [1] https://github.com/edn-format/edn
         | 
         | [2] https://github.com/cognitect/transit-format
        
         | im3w1l wrote:
         | So one thing I wasnt sure of is: If you have a Starlark program
         | how is the value of it decided? Is it simply the value of the
         | last expression? And where does the print-output end up? Is it
         | just for diagnostics and has no influence on the value?
        
         | leontrolski wrote:
         | How about just nudge json a couple more notches towards js?
         | https://github.com/leontrolski/dnjs
        
         | seedless-sensat wrote:
         | Plenty of tools lacking in the Starlark environment, e.g.:
         | generating Starlark files, machine editting Starlark maps
        
       | arpa wrote:
       | XML above all!
        
         | Spivak wrote:
         | XML in theory is a great format for what it represents -- a
         | tree of heterogeneous typed simple key/value pairs.
         | 
         | The problem is almost no data that people want to actually
         | represent has this form and every way people have tried to beat
         | XML into representing other things (i.e. lists and dicts) is
         | kludgy is awkward.
        
       | badrabbit wrote:
       | My opinion: I can live with yaml and json. Toml,tjson if I have
       | to. Xml with a gun to my head. But I don't want yet another
       | markup language (ironically that's what YAML stands for)
        
         | adorton wrote:
         | YAML stands for "YAML Ain't Markup Language"
        
           | ashtonkem wrote:
           | Which is more than a tad bit ironic, in retrospect.
        
             | lawtalkinghuman wrote:
             | Not really since it's true. It isn't markup, it's a
             | configuration file format.
             | 
             | "<em>This</em> is a markup language" since there is text
             | which is marked up.
             | 
             | YAML/JSON is a way to serialise fairly common data
             | structures (arrays/lists, hashes/dictionaries, numbers,
             | strings, bools, etc.)
             | 
             | Incidentally, if you can seamlessly replace XML with
             | something like JSON, then you probably aren't using the
             | 'markup' bit of XML.
        
         | PaulHoule wrote:
         | What I want from YAML (or a competitor) is access to the
         | concrete syntax tree.
         | 
         | For one of my art projects I make YAML files that describe the
         | front side, back side, and web side of a "three sided card". I
         | generate these out of several templates, currently using
         | ordinary string templating.
         | 
         | I'd love to be able to load a YAML file and add something
         | programatically to the list and have the list stay in the same
         | format that it was in, so if it was a                  [1,2,3]
         | 
         | list I get                  [1,2,3,4]
         | 
         | if it was a                  - 1        - 2        - 3
         | 
         | list I want                  - 1        - 2        - 3        -
         | 4
         | 
         | sadly I'm the only one who thinks this way.
        
           | Ciantic wrote:
           | You are not the only one. But even if you find a library for
           | YAML AST transformations for your language. What ever other
           | language uses your YAML probably doesn't have it.
           | 
           | E.g. I tried exactly the same thing, and it was quiet
           | difficult with Rust. Because the way to parse it usually is
           | with serde and it just removes the AST of course.
           | 
           | In the end I gave up, and just used JSON for my use case.
        
           | stavros wrote:
           | https://yaml.readthedocs.io/
        
       | the_duke wrote:
       | Two interesting configuration language alternatives:
       | 
       | https://dhall-lang.org/
       | 
       | https://cuelang.org/
        
         | BiteCode_dev wrote:
         | I've tried dhall, cue and jsonet, and cue is so far my fav.
         | It's very well designed, expressive, but restrictive enough so
         | that config files don't look like scripts.
         | 
         | The way it blend types and values makes learning it super easy,
         | yet you can do complex things with few lines.
         | 
         | But the main implementation exports to yaml without quoting the
         | strings, which kinda defeat the purpose :(
        
           | mananaysiempre wrote:
           | I'm kind of unsure about the way CUE achieves reuse: if I
           | understand correctly, you have files in a directory tree and
           | the (result of processing the) bottommost files are the
           | things you're supposed to point your consuming tools at. So
           | there's no way to share structure among a collection of items
           | if that collection is nested inside your config, the only
           | operation available is essentially the generation of a set of
           | similar but separate configs. Or am I wrong here? I'd very
           | much like to be.
           | 
           | (Also, the type system is absolutely delicious, but it badly
           | needs a paper with a complete description. I'm extremely
           | interested in how it works, but fragmentary "notes on the
           | formalism underlying" CUE are not enough.)
        
             | BiteCode_dev wrote:
             | You do have imports and functions so you can reuse what you
             | want.
             | 
             | The doc is also quite clear and rich, but the way it's
             | organized means I have to read it entirely before writting
             | my first CUE file. It also lacks IRL examples so trials and
             | errors were my best friends.
             | 
             | It can be discouraging.
        
       | stillicidious wrote:
       | Author seems to use misfeatures of a particular implementation to
       | tar all implementations with. The round-tripping issue is not a
       | statement about YAML as a markup language, much in the way a
       | rendering bug in Firefox is not a statement about the web.
       | 
       | Stepping back a bit, YAML is good enough, and this problem has
       | been incrementally bikeshedded since at least the 1970s, it is
       | time to move on. Human-convenient interfaces (like YAML, bash,
       | perl) are fundamentally messy because we are messy. They're prone
       | to opinion and style, as if replacing some part or other will
       | make the high level problem (that's us) go away. Fretting over
       | perfection in UI is an utterly pointless waste of time.
       | 
       | I don't know what NestedText is and find it very difficulty to
       | care, there are far more important problems in life to be
       | concerned with than yet another incremental retake on
       | serialization. I find it hard to consider contributions like this
       | to be helpful or represent progress in any way.
        
         | throwaway81523 wrote:
         | > Stepping back a bit, YAML is good enough, and this problem
         | has been incrementally bikeshedded since at least the 1970s, it
         | is time to move on
         | 
         | Nah, in the 1970s we had Lisp S-expressions that completely
         | solved the problem, and everything since then has been
         | regressions on S-expressions due to parenthesis phobia.
         | 
         | After hearing that thing about the country code for Norway, I
         | became convinced that YAML has to just die. Become an ex-markup
         | language. Pine for the fjords. Be a syntax that wouldn't VOOM
         | if you put 4 million volts through it. Join the choir
         | invisible, etc.
         | 
         | This is good: https://noyaml.com/
         | 
         | Erik Naggum had a notoriously NSFW rant about XML (over the top
         | even for him) that I better not link to here, but lots of it
         | applies to YAML as well.
        
         | Aloha wrote:
         | If you use YAML in situations where it may need hand editing,
         | it means you actively hate your users.
         | 
         | YAML is patently unsuitable for any use case where the
         | resulting output may require hand editing.
        
         | AYBABTME wrote:
         | It'd be bikeshedding if the status quo was good. But it isn't.
        
         | dmitriid wrote:
         | > Author seems to use misfeatures of a particular
         | implementation to tar all implementations with.
         | 
         | There's no canonical YAML implementation, and YAML spec is
         | enormous (doubly so if you need to work with stuff like non-
         | quoted strings etc. )
        
         | tannhaeuser wrote:
         | > _YAML as a markup language_
         | 
         | YAML ain't markup language.
        
         | spicybright wrote:
         | I actually disagree it's bike shedding.
         | 
         | If you can write a bad YAML document because of those mis-
         | features/edge cases, I'd say you've already lost.
         | 
         | Humans are messy, but at the end of the day the data has to go
         | to a program, so a concise and super simple interface has a lot
         | of power to it for humans.
         | 
         | Working at a typical software company with average skill level
         | engineers (including myself), no one likes writing YAML. But
         | everyone is fine with JSON.
         | 
         | I think it's a case of conceptual purity vs what an _average_
         | engineer would actually want to use. And JSON wins that. If
         | YAML was really better than JSON, we 'd all be using that right
         | now.
         | 
         | So does it really matter if YAML is superior if >80% of
         | engineers pick JSON instead?
        
       | posharma wrote:
       | It's really sad to see the pervasiveness of JSON. For one thing
       | its usage as a config file is disturbing. Config files _need_ to
       | have comments. Second, even as a data transfer format the lack of
       | schema is even more disturbing. I really wish JSON didn 't happen
       | and now these malpractices are so widespread that it's hurting
       | everyone.
        
         | runarberg wrote:
         | Tools that use JSON as configuration format could simply allow
         | certain unused keys (e.g. all keys starting with #) and promise
         | never to use them. Then author can write their comments with
         | something like:                   {           "name": "my-
         | tool",           "#comment-1": "Don't change the version!",
         | "version": "42.1337.0"         }
        
           | posharma wrote:
           | I've heard and read this multiple times. Why are you trying
           | so hard to fit into a format that doesn't just support
           | comments out of the box? What advantages is JSON offering you
           | that you've compelled to bend over backwards to do this? It's
           | exactly these kinds of workarounds that is making it super
           | difficult stop such malpractices. It's just plain ugly.
           | Please stop doing this.
        
         | jackjeff wrote:
         | JSONC. JSON with comments. And even if your favorite parser
         | does not support it natively it's not so hard to add with a
         | very simple pre-lexer step.
         | 
         | JSON schemas exist and they're ok for relatively simple things.
         | For more complex cases I find myself wishing I could just turn
         | Typescript into some kind of schema validation for JSON.
        
         | umvi wrote:
         | So you prefer the "good old" XML days? I'll take comment-less
         | JSON over XML any day
         | 
         | (and it doesn't have to be comment-less... JSON with comments
         | is a thing and VSCode has syntax highlighting for it - just
         | strip out the comments before parsing).
        
           | [deleted]
        
           | zz865 wrote:
           | XML is perfect. + With all the fancy editors now its very
           | easy to write. Easy schema to check, comments. Perfect.
        
             | nsonha wrote:
             | not easy to read, it's the java of config, pages of code
             | that express very little, by the time you find what you
             | need, you forget the context and what level of nesting
             | you're on already. It's also more wasteful as a transport.
        
           | posharma wrote:
           | It's simple. For config files, choose the format that has the
           | best tooling in your company and that supports comments. For
           | data transfer, choose that supports schemas, backwards
           | compatibility and good tooling (protobufs is just one e.g.
           | that I'm most familiar with).
        
           | stavros wrote:
           | > So you prefer the "good old" XML days? I'll take comment-
           | less JSON over XML any day
           | 
           | Aren't we past basic false dichotomies?
        
             | saurik wrote:
             | Nope: basic false dichotomies and JSON are both ubiquitous.
        
       | avsteele wrote:
       | I'll give my opinion as someone who has to choose among JSON,
       | XML, TOML, and YAML about two years ago for a new project.
       | Whatever I chose had to be easy for end-users who don't know the
       | specification to to understand later.
       | 
       | Here were my thoughts on the options.
       | 
       | JSON - No comments -> impossible
       | 
       | XML - Unreadable
       | 
       | YAML - 2nd place. Meaningful indentation also made me worried
       | someone was going to not understand why their file didn't work.
       | The lack of quotes around strings was frustrating.
       | 
       | TOML - 1st place. Simpler than YAML to read & parse. It truly
       | seems 'obvious' like the name says.
       | 
       | I haven't encountered any situations where I wish I had more than
       | TOML offers.
        
       | Drdrdrq wrote:
       | > NestedText only supports three data types (strings, lists and
       | dictionaries)...
       | 
       | No numbers? Looks nice otherwise, but this seems like a very
       | weird decision.
       | 
       | That said, JSON with its "I might overflow your number" attitude
       | is not much better in this regard.
        
         | mongol wrote:
         | Yes but I can understand the rationale. There are many numeric
         | types and settling on some excludes use with others. If letting
         | the application handle that, the configuration language can
         | remain simple. His example where a version number 1.10 was
         | round trip converted to 1.1 was enlightening.
        
       | zmmmmm wrote:
       | I have to say I hate the fact that I have low confidence when
       | editing YAML that the result will be what I intend. It's kind of
       | the number one job of such a format. And I routinely run into
       | people using advanced features and then I have no idea at all how
       | to safely edit it. It is interesting that it seems so difficult
       | to pick a good tradeoff between flexibility and complexity with
       | these kinds of languages.
        
       | forrestthewoods wrote:
       | Here's my dream config language:
       | 
       | * start with JSON
       | 
       | * add comments (obviously)
       | 
       | * allow trailing commas (obviously)
       | 
       | * allow left-side and right-side to be independently and
       | explicitly typed
       | 
       | * extensible type support (JSON's lack of u64 is absurd)
       | 
       | For example the following are all equivalent:
       | 
       | * "foo" : f32 = 13.37
       | 
       | * "bar" : f32 = "13.37"
       | 
       | * "baz" : f32 = 0x4155eb85 : hex
       | 
       | And extensibility to allow:
       | 
       | * "ham" : u64 = 123456789123
       | 
       | I would also be inclined to allow explicit config file hierarchy
       | by allowing:
       | 
       | * configs can specify their base
       | 
       | * configs can specify their child
       | 
       | * must be acylic
       | 
       | I've thought about implementing this myself. But I've never
       | written a real lexer or parser. It's on my side-project TODO
       | list.
        
         | heinrich5991 wrote:
         | JSON has integer types/literals AFAIK, it's just that the
         | Javascript implementation doesn't support them.
        
           | forrestthewoods wrote:
           | It has numeric literals. But all JSON number types are f64.
           | Which is sufficient to represent every 32-bit integer, but it
           | can not represent all 64-bit integers.
           | 
           | For code that needs a 64-bit integer, which is quite a lot,
           | you have to encode the integer in a string.
           | 
           | Lack of 64-bit integer (either signed or unsigned) is a
           | pretty common and well understood pain point when using JSON
           | as an interchange format.
        
       | twobitshifter wrote:
       | I wrote a program at a corporate job where all the configuration
       | is in Excel files. Tables are just fed into a dictionary and
       | columns on each worksheet are predefined to hold the keys. People
       | loved it because they know how to use excel and "text" is scary.
       | (This is all very strange because they are just entering text in
       | Excel, but the familiarity goes a long way)
        
         | foepys wrote:
         | I _recently_ suffered through a meeting where we developers
         | were told to use the _new_ testing framework some team at our
         | corp created. It's written in Java (we use .NET exclusively in
         | our branch), configured via Excel sheets and Java, and exports
         | results also as Excel sheets.
         | 
         | Whoever thought this was a good idea in 2021 has to be
         | braindead. But the CEO was pleased. Probably because they know
         | Excel.
        
           | pjmlp wrote:
           | I give you Robot, originally created at Nokia.
           | 
           | https://robotframework.org
           | 
           | Back in 2006, the testing was written in HTML tables, no idea
           | how it manage to still be around.
        
         | bluedino wrote:
         | Same but ms access
        
       | pjmlp wrote:
       | I just stick to XML unless forced to use something else.
       | 
       | Schema validation, code completion on IDEs, endless amount of
       | tooling including graphical visualisation, a language for data
       | transformation and queries, and.... wait for it... comments!
        
       | sl0w0rm wrote:
       | I'm working on my own (you can start the attack hahaha). I feel
       | there's not many simple, generic languages that allow to write
       | simple DSLs with embedded documentation. The self documenting
       | part is still missing but you can take a look and say what you
       | think. It's kind of like yaml format (a bit TOML) with schema and
       | possibility to merge multiple files with smaller chanks of the
       | data. With export to json and yaml.
       | https://github.com/dadlang/dadl
        
         | MH15 wrote:
         | This looks pretty cool
        
       | lox wrote:
       | Have spent many years developing dev tools that use YAML and
       | alternatives and I still think YAML wins because of its ubiquity
       | relative interop with JSON. I'd pick HCL as an alternative if I
       | was going to, as it's been widely battle tested in Terraform.
        
       | andrewdubinsky wrote:
       | JSON is often so hard to read I have to open a file in a
       | formatting tool. It's also hard to tell if there's a simple
       | missing quote or brace. Those are extra steps I don't have with
       | YAML. For many things, JSON is great. For simple loaders, YAML
       | gets it done quick and easy. They are functionally interoperable
       | for the most part so I use what's best.
       | 
       | I'd also add the author has a competing framework so maybe
       | there's a bit of pre-existing bias.
        
         | zamadatix wrote:
         | I'm not sure I'd trust manually editing either in a plain text
         | editor. YAML cares about whitespace yet will silently make most
         | combinations valid and it also has surprising pitfalls on type
         | interpretation if one isn't consistently on top of it when
         | entering data. JSON has a bunch of additional characters but at
         | least if you forget them you have a higher chance of it just
         | telling you it's wrong when you try to use it.
         | 
         | Thankfully it's very rare I ever have to open any config file
         | in a text editor that isn't aware of dozens of formats so
         | things like a missing brace are always suggested anyways and it
         | isn't much a problem regardless of format.
        
         | initplus wrote:
         | When you miss a quote or a brace in JSON, the JSON fails to
         | parse. When you make a similar minor mistake in YAML, you often
         | end up with a valid but nonsensical document with completely
         | incorrect structure.
         | 
         | I don't want the language to be flexible enough that simple
         | common errors go unnoticed - I WANT the parser to tell me at
         | parse time if I screwed something up. It's a similar dynamic to
         | dynamic/static typing.
        
       | woodruffw wrote:
       | I'm glad to see people experimenting with alternative
       | document/object representations, but this one might be a hard
       | sell: based on the README[1], it only has Python, Zig and Janet
       | implementations so far. One of the nice things about YAML (and
       | JSON, TOML, etc.) is that they have decently mature C, C++, or
       | Rust libraries that other languages bind to.
       | 
       | [1]: https://github.com/KenKundert/nestedtext
        
       | dylan604 wrote:
       | I have a client that uses a CMS of unknown origins. I just get
       | stuff placed in an s3 bucket, and then attempt to parse what was
       | provided. 100% of their YAML files are invalid by every single
       | linter I have found/tried. Not one of them understands where the
       | error is occuring to help debug. It litterally just says invalid.
       | I'm at a total loss. My head doesn't think YAML. Does a string
       | need quoting or not? trailing spaces at the end causes problems?
       | my personal experience in YAML is limited, but it hasn't been
       | pleasant.
        
       | diob wrote:
       | What is the obsession with removing braces? I will never find the
       | lack of clear demarcations (relying on indent) easier than
       | braces.
        
         | rhn_mk1 wrote:
         | Isn't an indent a clear demarcation?
        
           | zmmmmm wrote:
           | Only if you forbid tabs ...
        
           | goodpoint wrote:
           | Not at all.
           | 
           | If it was code, an indentation error would often not compile
           | or show errors or fail tests.
           | 
           | Configuration in YAML is much worse: most of the time an
           | indentation error goes undetected until an application starts
           | misbehaving.
           | 
           | Significant whitespace is perfectly ok for code but a huge
           | footgun for YAML
        
           | dylan604 wrote:
           | tabs or spaces for that indent?
           | 
           | it makes a difference on how it is parsed, so it's more than
           | a devs preference
        
             | kevincox wrote:
             | It really doesn't matter. Just force the leading indent to
             | be exactly the same bytes. If indent moves between two
             | values where one isn't a prefix of the other raise an
             | error.
        
           | aimor wrote:
           | Literally, yes.
           | 
           | But I find it incredibly annoying to estimate indentation
           | when lines are wrapped in an editor (or webpage). Or, to a
           | lesser extent but still throws me off, when multiple blocks
           | end at the same line. Or when pasting blocks into another
           | block, and having to double check to make sure the
           | indentation was carried over correctly. I like editors that
           | visually show indentation characters.
        
         | andybak wrote:
         | Visual clutter, familiarity to non-coders. Curly braces are
         | almost never used outside of programming and are ugly to boot.
         | 
         | My benchmark for yaml/JSON alternatives is "how would I feel
         | explaining it to a busy, sceptical client?"
         | 
         | If the intended audience is purely developers, then sure. JSON
         | (with the addition of comments and trailing commas) is just
         | fine.
         | 
         | White space has the additional advantage of agreeing with
         | itself. Other demarcations can have issues where the
         | indentation and the structure contradict each other.
        
           | diob wrote:
           | My google ability didn't see anything, but are their any case
           | studies that show it's more readable? I'm happy to accept
           | that it is, but I can't help wondering if research has been
           | done or it's mostly gut feeling / anecdotes / aesthetics.
        
           | zippergz wrote:
           | I haven't found "this needs to be indented exactly the right
           | amount or it won't work" to be much easier for non-
           | programmers than "this needs to be enclosed in braces or it
           | won't work." Most people have at least experienced
           | parentheses in math (albeit maybe decades ago), so it's not
           | an entirely foreign concept. Either one requires a bit of
           | learning, but I think most people are capable of it, so any
           | improvement in non-coder familiarity seems minor at best, vs.
           | the very real costs.
        
           | szastamasta wrote:
           | Again the dreaded Cobol argument. We had to struggle with a
           | lot of this in the past: Cobol, SQL, YAML, BDD. All this
           | would be much easier without this nonsensical idea that
           | nontechnical people will read code. They won't. Making code a
           | bit more like prose doesn't make it readable for nontechnical
           | people. Yet we again and again make our life harder - ugly
           | syntax rules, no code completion, no auto-formatters.
           | 
           | Please stop making code easy for non-coders. They don't want
           | to read it. They never did. They just want this damn box to
           | work.
        
             | andybak wrote:
             | Wrong use case. I'm talking about asking them to write it
             | edit these files.
        
             | gmadsen wrote:
             | as a counter argument. I work in robotics, where many
             | operators will look at and change settings in a yaml file
             | during testing. They do not have software skills outside of
             | this.
        
               | eitland wrote:
               | My educated guess then is you could have gotten them to
               | change "settings" in C, Java or basically anything.
               | 
               | Just put the file in the root folder, and keep it as
               | simple as possible and you should be fine? I mean, if
               | they manage to write yaml correctly and consistently C is
               | no match?
        
               | gmadsen wrote:
               | maybe? the dynamic loading of the configs kind of
               | restricts it to a markup language.
        
           | forrestthewoods wrote:
           | Significant whitespace is evil. It's just begging for
           | copy/paste bugs.
        
           | diob wrote:
           | That's just display though, if you have to show it to a
           | skeptical client, why not run it through a browser that shows
           | it without braces? It's the same as showing a webpage instead
           | of the html.
        
             | andybak wrote:
             | I was specifically thinking about asking clients to edit or
             | write these files. Isn't that a fairly common use case for
             | config languages?
        
               | diob wrote:
               | That's a good point someone brought up in a different
               | comment. I haven't really dealt with those scenarios, so
               | honestly I'll accept that as a reason.
               | 
               | I wish it could be displayed with braces though, I wonder
               | if someone already has built that as an extension for
               | editing / viewing yaml files.
        
               | colejohnson66 wrote:
               | YAML is a superset of JSON. In other words: any
               | syntactically valid JSON file is a valid YAML file. If
               | you want braces like JSOM, but not quoted strings, YAML
               | supports it.
        
               | initplus wrote:
               | If programmers find getting YAML indentation correct
               | difficult how are non-programmers going to fair?
        
               | deadbunny wrote:
               | If the HomeAssistant subreddit is anything to go by its
               | their biggest complaint (HA configuration is in YAML).
               | 
               | With that said if they weren't complaining about white
               | space they'd be complainit about missing semicolons,
               | missing/extra commas, missig equals signs, missing
               | closing )]} or whatever.
        
             | CJefferson wrote:
             | You could run a formatter which adds braces if you like?
        
           | jstx1 wrote:
           | This makes zero sense to me. Why do config files out of all
           | things have to be accessible to non-coders?
        
             | remram wrote:
             | Because they're not code?
        
             | andybak wrote:
             | Because we are asking them to write these things in many
             | cases.
        
               | jstx1 wrote:
               | I'm not buying that you genuinely have a target audience
               | of "I trust this person with config files but their eyes
               | are too gentle to see a curly brace".
        
       | kesor wrote:
       | 927
        
       | it_does_follow wrote:
       | > YAML is considered by many to be a human friendly alternative
       | to JSON
       | 
       | I'm not disagreeing with the author here, but as someone old
       | enough to remember the rise of XML as a data transmission format
       | (and Erik Naggum's masterful rant against it[0]), it's strange
       | because historically speaking both XML and JSON were also
       | popularized as more "human readable".
       | 
       | I would be curious how many HNers (and even more so newer
       | developers outside the HN-o-sphere) have worked extensively with
       | or even written parsers for binary (or otherwise non-human
       | readable) file formats. Writing an MP3 metadata parser used to be
       | a standard exercise for devs looking to level up their
       | programming skills a bit.
       | 
       | It personally feels weird to me that we would keep pushing for
       | more "human readable" data formats when the world is increasingly
       | removed from one where non-programmer humans need to read data.
       | Keep your data in whatever format make sense and let software
       | handle transforming it to a more readable or more efficient
       | format depending on the needs, even if humans can't read it (they
       | shouldn't need to!).
       | 
       | On top of all that my experience has been that JSON leads to more
       | atrocities than XML (while fully agreeing with all of Erik
       | Naggum's points about that) and YAML creates even worse horrors
       | than JSON. It seems we'll soon be approaching eldritch horrors if
       | we continue to pursue human readable data exchange formats.
       | 
       | 0. https://www.schnada.de/grapt/eriknaggum-xmlrant.html
        
         | foxfluff wrote:
         | As an embedded sw dev working on things that interface with
         | legacy devices, I have written lots and lots of binary parsers
         | (as well as serial, net, and ipc protocols). I've also reversed
         | some binary formats used by games, etc.
         | 
         | I like binary formats for things that are simple and don't
         | change too often. However, I still love not having to waste
         | days on studying yet another bespoke binary format & parser for
         | things that are complex and don't work right for whatever
         | reason. So when performance isn't a concern and you aren't
         | working in a size-constrained environment, I do find that
         | "human readable" formats are often worth it.
         | 
         | As a practical example, I recently hit a bug where KiCad moved
         | some custom footprints' pad shapes around after saving &
         | reloading. And I quickly discovered that the footprint files
         | are just S-expressions and relatively self-descriptive so I
         | fixed my issue in five minutes with vim without ever needing to
         | look at docs or code. That kind of thing is super convenient.
         | Later I discovered that other users are likewise working around
         | the program's limitations using a text editor or custom scripts
         | to manipulate things KiCad won't do for you; for example, to
         | create a repetitive pattern of components in a layout more
         | complicated than a grid.
        
       | pdimitar wrote:
       | Naive question: is it viable if we started using Lua[JIT] for
       | configuration, like NeoVim and likely others do?
       | 
       | Can Lua's interpreter be compiled without some "dangerous" APIs
       | enabled (whichever those might be) and thus be made viable as an
       | embeddable and isolated configuration engine?
       | 
       | I'm just getting sick and tired of all the half-baked
       | configuration formats and want to look for something that's both
       | more flexible but still strict and unambiguous. I wonder if it's
       | possible?
       | 
       | As I said, naive question.
        
       | Areading314 wrote:
       | Surprised they didn't call it YAYAML
        
       | deknos wrote:
       | what's wrong with dhall?
        
         | de_keyboard wrote:
         | Does Dhall have a .NET implementation yet?
        
           | Smaug123 wrote:
           | You can always convert it to JSON before consumption.
        
           | FridgeSeal wrote:
           | I'm confused: why would Dhall need a specific .net
           | implementation?
        
             | dmitriid wrote:
             | Because you don't want to bring in a separate language with
             | a separate runtime with unknown interop story just to read
             | config files?
        
       | thefifthsetpin wrote:
       | I don't like YAML and would like to move on, but I hope we don't
       | move onto this.
       | 
       | I think it's crazy that when I add a string to an inline list, I
       | may need to convert that inline list to a list because _this_
       | string needs different handling. I think it 's crazy that
       | "convert an inline list to a list" is a coherent statement, but
       | that is the nomenclature that they chose.
       | 
       | I don't like that a truncated document is a complete and valid
       | document.
       | 
       | But what is most unappealing is their whitespace handling. I
       | couldn't even figure out how to encode a string with CR line
       | endings. So, I downloaded their python client to see how it did
       | it. Turns out, they couldn't figure it out either:
       | 
       | >>> nt.loads(nt.dumps("\r"),top="str") '\n'
        
       | nsonha wrote:
       | the boolean thing is dumb, otherwise yaml is a fine format
        
       | evanmoran wrote:
       | Keeping leaf values as strings is quite elegant. I've found the
       | auto conversion to be inconsistent across yaml implementations in
       | different languages.
        
       | Animats wrote:
       | The trouble is that people insist in writing trees using plain
       | text editors. Trees should be written in tree editors. Then you
       | can't get the delimiters wrong.
       | 
       | "NestedText was inspired by YAML, but eschews its complexity. "
       | 
       | Mandatory XKCD: https://xkcd.com/927/
       | 
       | Fun fact: HTML was invented because SGML was "too complicated".
        
         | mongol wrote:
         | What is a tree editor?
        
       | iamleppert wrote:
       | I've never liked YAML. For whatever reason, it always feels like
       | working in a mine field. It comes from the same cargo cult of
       | people who think the problem with human machine formats is that
       | it needs to be "clean".
       | 
       | Clean, of course to them means some bizarre aesthetic notion of
       | removing as much as possible. Only it's taken to an extreme. I
       | wonder if the same people also think books would be better with
       | all punctuation be removed to make it look "clean"?
       | 
       | It's unhealthy minimalism, causes more problems than it solves.
       | As soon as I see a project using YAML I cringe and try to find an
       | alternative because god knows what other poor choices the
       | developer has made. In that sense, YAML can be considered a red
       | herring and I'm usually right. The last project I used that
       | adopted an overly complex and build-breaking YAML configuration
       | syntax had other problems hiding under the covers, and in some
       | cases couldn't parse it's own syntax due to YAML's overly broad
       | but at the same time opinionated syntax.
       | 
       | Just say no to YAML.
        
         | politelemon wrote:
         | I've often heard this argument about YAML being "clean", but
         | over time I have realized that they are conflating minimalism
         | with cleaninless, when they are two different things. That
         | realization is what it took for me to realize why I didn't like
         | it. I did _not_ find it clean, I found it "messy" by virtue of
         | the increased cognitive overhead. But it is minimal at least
         | compared to other formats. Other formats appear cleaner to me.
        
       | [deleted]
        
       | whynotmaybe wrote:
       | Mandatory xkcd
       | 
       | https://xkcd.com/927/
        
       | rendall wrote:
       | I don't understand this. YAML has limitations. All formats have
       | limitations. If a format is too limiting, don't use it. Pick one
       | more suitable, or come up with another one, like NestedText (or
       | whatever). What is this need to tell everyone else to "move on"
       | from using some format because it doesn't sit your specific
       | preferences or use case?
        
         | tannhaeuser wrote:
         | Especially since the post title doesn't match the linked
         | article's heading.
        
           | rendall wrote:
           | Yes! Thanks for pointing that out! You're right!
        
         | remram wrote:
         | I don't understand this. Opinions are not universal, every
         | blogger has limitations. If you don't agree with a HN title,
         | don't read it. Pick the next one or read another site. What is
         | this need to tell everyone that you don't like them to tell
         | everyone to "move on" just because it doesn't sit your specific
         | preferences in formulation?
        
           | rendall wrote:
           | I see what you did there, but it comes off as mocking and not
           | so clever.
           | 
           | The difference between my post and that blog, and your reply
           | for that matter, is that I'm not telling anyone not to read
           | it. I'm inviting you to comment on why people feel the need
           | to tell others to move on.
           | 
           | Here's a good example of how to respectfully disagree:
           | https://news.ycombinator.com/item?id=29220994
        
         | firearm-halter wrote:
         | The person that creates the config file does not necessarily
         | choose the config file format. In the example, github chose
         | YAML and everyone using github actions must use it. YAML is
         | error prone, as everyone that tests with Python is finding out
         | as the add Python 3.10 to their regression tests. This is a
         | plea to organizations like github to stop choosing YAML.
        
           | ccouzens wrote:
           | YAML is a superset of JSON.
           | 
           | Which means anything that accepts YAML accepts JSON.
           | 
           | So you can write your Github action code in JSON (with a yml
           | file extension).
        
           | rendall wrote:
           | As not a Python programmer, I'm struggling to understand the
           | issue.
           | 
           | Your (or blogger's) claim is that GitHub misparses the YAML
           | actions config when it comes specifically to Python? Or that
           | YAML is inherently inadequate to the task of representing
           | Python's necessary actions?
        
             | kzrdude wrote:
             | The Python 3.10 issue is this, in yaml:
             | Python_versions:       - 3.8       - 3.9
             | 
             | Then we add the new version in our yaml file:
             | Python_versions:       - 3.8       - 3.9       - 3.10
             | 
             | But _now_ we discover that 3.10 is parsed as a float, just
             | like the other ones were. But the problem is that 3.10
             | becomes 3.1, the equivalent float value! With 3.9 we didn
             | 't notice this problem.
        
         | initplus wrote:
         | YAML's lack of limitations is the source of much of the
         | difficulty with the format. The numerous ways to represent
         | basic data (arrays, strings etc) is a common source of error.
         | YAML doesn't have enough limitations!
         | 
         | And you can't pick what config format a tool you need uses.
        
           | rendall wrote:
           | But, GitHub, specifically has very specific guidelines on
           | what to write and how to format it, and will give pretty
           | detailed error messages if it's badly formatted. Not to
           | mention tooling to format and highlight. I'm not seeing how
           | the proposed NestedText is inherently free from those same
           | issues: the need for tooling, guidance, error messages. Is
           | the claim that it's easier?
        
       | IceWreck wrote:
       | Huh, no. YAML is a superset of JSON. So valid JSON is valid YAML.
       | This is sometimes suprisingly useful. Also, YAML is used
       | everywhere and like the other user pointed out, has mature well
       | tested libs for almost every language.
        
         | tuukkah wrote:
         | Indeed: "YAML version 1.2 is a superset of JSON"
         | https://en.m.wikipedia.org/wiki/JSON#YAML
        
         | TedDoesntTalk wrote:
         | How is YAML a superset of JSON? never heard that claim before.
        
           | BiteCode_dev wrote:
           | Any valid json can be parsed by any 1.2 yaml parser. That's
           | how it gained popularity in the first place: you didn't have
           | to migrate. Like ascii and utf8.
        
           | rudian wrote:
           | You can turn any piece of a YAML into a JSON object and it
           | will be read just as well.
           | 
           | This YAML:                   user:           name: Ted
           | 
           | is equivalent to this YAML:                   user: {"name":
           | "Ted"}
           | 
           | which is equivalent to this YAML/JSON:
           | {"user": {"name": "Ted"}}
        
             | erik_seaberg wrote:
             | YAML supports tagged nodes and multiple documents in a
             | stream, which can't be represented in standard JSON. You
             | could make up conventions, but only your parser would
             | support them.
        
             | Spivak wrote:
             | While true, this is what being a supperset means. What it
             | means is that any JSON document is, _without modification_
             | , valid YAML document and can be read with a YAML parser.
        
               | andoriyu wrote:
               | That's exactly the case. Any YAML 1.2 parser can parse
               | any valid json document as is.
        
           | NoThisIsMe wrote:
           | It just is: Any valid JSON is valid YAML with the same
           | semantics. It was intentionally designed that way (though not
           | from the start iirc).
           | 
           | Basically take JSON, make quotes optional for strings and
           | make curly brackets optional if the object is indented
           | properly, and boom you've got (something like) YAML.
        
             | yuuu wrote:
             | If all JSON is YAML but not all YAML is JSON, then YAML is
             | a superset of JSON.
        
         | imglorp wrote:
         | Another JSON superset is HOCON. The H is for human.
        
       | _bsless wrote:
       | Modest proposal - The real problem I see with JSON is it's not
       | rich enough. Not a problem if you're using EDN
       | 
       | https://github.com/edn-format/edn
        
       ___________________________________________________________________
       (page generated 2021-11-14 23:00 UTC)