jq (programming language)

jq
Paradigm Purely functional programming, JSON processing oriented
Designed by Stephen Dolan
First appeared 2012 (2012)
Stable release
1.5 / August 18, 2015 (2015-08-18)
Typing discipline dynamic
Website stedolan.github.io/jq/
Major implementations
jq
Influenced by
Icon, Haskell

jq is a very high-level functional programming language with support for backtracking and managing streams of JSON data. It is related to the Icon and Haskell programming languages.

Basic syntax

The jq language is based on the same concepts of streams, pipes, and filters that are familiar from the Unix shell. Filters can be constructed from valid JSON expressions using a JSON-oriented syntax and are connected using the pipe character "|". The identity filter is ".", so that for example the expression 1 | {"a": .} would produce the JSON value: {"a": 1}.

Here is an example showing how to define a named, parameterized filter for formatting an integer in any base. The implementation illustrates tacit programming:

def tobase($b):
    def digit: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[.:.+1];
    def div: (. / $b) | floor;
    def mod: . % $b;
    def r: if . < $b then digit else (div | r) + (mod | digit) end;
    #
    select(2 <= $b and $b <= 36)
    | r
;

The next example demonstrates the use of generators in a classical verbal arithmetic game:

def send_more_money:
    def choose(m;n;used): ([range(m;n+1)] - used)[];
    def num(a;b;c;d): 1000*a + 100*b + 10*c + d;
    def num(a;b;c;d;e): 10*num(a;b;c;d) + e;
    label $exit
    | 1 as $m
    | 0 as $o
    | choose(8;9;[]) as $s
    | choose(2;9;[$s]) as $e
    | choose(2;9;[$s,$e]) as $n
    | choose(2;9;[$s,$e,$n]) as $d
    | choose(2;9;[$s,$e,$n,$d]) as $r
    | choose(2;9;[$s,$e,$n,$d,$r]) as $y
    | select(num($s;$e;$n;$d) + num($m;$o;$r;$e) == num($m;$o;$n;$e;$y))
    | [$s,$e,$n,$d,$m,$o,$r,$e,$m,$o,$n,$e,$y],
      break $exit
;

See also

References

The jq manual and the jq wiki are the main jq references.

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.