Urbit Docs
  • What is Urbit?
  • Get on Urbit
  • Build on Urbit
    • Contents
    • Environment Setup
    • Hoon School
      • 1. Hoon Syntax
      • 2. Azimuth (Urbit ID)
      • 3. Gates (Functions)
      • 4. Molds (Types)
      • 5. Cores
      • 6. Trees and Addressing
      • 7. Libraries
      • 8. Testing Code
      • 9. Text Processing I
      • 10. Cores and Doors
      • 11. Data Structures
      • 12. Type Checking
      • 13. Conditional Logic
      • 14. Subject-Oriented Programming
      • 15. Text Processing II
      • 16. Functional Programming
      • 17. Text Processing III
      • 18. Generic and Variant Cores
      • 19. Mathematics
    • App School I
      • 1. Arvo
      • 2. The Agent Core
      • 3. Imports and Aliases
      • 4. Lifecycle
      • 5. Cards
      • 6. Pokes
      • 7. Structures and Marks
      • 8. Subscriptions
      • 9. Vanes
      • 10. Scries
      • 11. Failure
      • 12. Next Steps
      • Appendix: Types
    • App School II (Full-Stack)
      • 1. Types
      • 2. Agent
      • 3. JSON
      • 4. Marks
      • 5. Eyre
      • 6. React app setup
      • 7. React app logic
      • 8. Desk and glob
      • 9. Summary
    • Core Academy
      • 1. Evaluating Nock
      • 2. Building Hoon
      • 3. The Core Stack
      • 4. Arvo I: The Main Sequence
      • 5. Arvo II: The Boot Sequence
      • 6. Vere I: u3 and the Serf
      • 7. Vere II: The Loom
      • 8. Vanes I: Behn, Dill, Kahn, Lick
      • 9. Vanes II: Ames
      • 10. Vanes III: Eyre, Iris
      • 11. Vanes IV: Clay
      • 12. Vanes V: Gall and Userspace
      • 13. Vanes VI: Khan, Lick
      • 14. Vanes VII: Jael, Azimuth
    • Runtime
      • U3
      • Conn.c Guide
      • How to Write a Jet
      • API Overview by Prefix
      • C in Urbit
      • Cryptography
      • Land of Nouns
    • Tools
      • Useful Links
      • JS Libraries
        • HTTP API
      • Docs App
        • File Format
        • Index File
        • Suggested Structure
    • Userspace
      • Command-Line App Tutorial
      • Remote Scry
      • Unit Tests
      • Software Distribution
        • Software Distribution Guide
        • Docket File
        • Glob
      • Examples
        • Building a CLI App
        • Debugging Wrapper
        • Host a Website
        • Serving a JS Game
        • Ship Monitoring
        • Styled Text
  • Urbit ID
    • What is Urbit ID?
    • Azimuth Data Flow
    • Life and Rift
    • Urbit HD Wallet
    • Advanced Azimuth Tools
    • Custom Roller Tutorial
    • Azimuth.eth Reference
    • Ecliptic.eth Reference
    • Layer 2
      • L2 Actions
      • L2 Rollers
      • L2 Roller HTTP RPC-API
      • L2 Transaction Format
  • Urbit OS
    • What is Urbit OS?
    • Base
      • Hood
      • Threads
        • Basics Tutorial
          • Bind
          • Fundamentals
          • Input
          • Output
          • Summary
        • HTTP API Guide
        • Spider API Reference
        • Strandio Reference
        • Examples
          • Child Thread
          • Fetch JSON
          • Gall
            • Poke Thread
            • Start Thread
            • Stop Thread
            • Take Facts
            • Take Result
          • Main-loop
          • Poke Agent
          • Scry
          • Take Fact
    • Kernel
      • Arvo
        • Cryptography
        • Move Trace
        • Scries
        • Subscriptions
      • Ames
        • Ames API Reference
        • Ames Cryptography
        • Ames Data Types
        • Ames Scry Reference
      • Behn
        • Behn API Reference
        • Behn Examples
        • Behn Scry Reference
      • Clay
        • Clay API Reference
        • Clay Architecture
        • Clay Data Types
        • Clay Examples
        • Clay Scry Reference
        • Filesystem Hierarchy
        • Marks
          • Mark Examples
          • Using Marks
          • Writing Marks
        • Using Clay
      • Dill
        • Dill API Reference
        • Dill Data Types
        • Dill Scry Reference
      • Eyre
        • EAuth
        • Eyre Data Types
        • Eyre External API
        • Eyre Internal API
        • Eyre Scry Reference
        • Low-Level Eyre Guide
        • Noun channels
      • Gall
        • Gall API Reference
        • Gall Data Types
        • Gall Scry Reference
      • Iris
        • Iris API Reference
        • Iris Data Types
        • Iris Example
      • Jael
        • Jael API Reference
        • Jael Data Types
        • Jael Examples
        • Jael Scry Reference
      • Khan
        • Khan API Reference
        • Khan Data Types
        • Khan Example
      • Lick
        • Lick API Reference
        • Lick Guide
        • Lick Examples
        • Lick Scry Reference
  • Hoon
    • Why Hoon?
    • Advanced Types
    • Arvo
    • Auras
    • Basic Types
    • Cheat Sheet
    • Cryptography
    • Examples
      • ABC Blocks
      • Competitive Programming
      • Emirp
      • Gleichniszahlenreihe
      • Islands
      • Luhn Number
      • Minimum Path Sum
      • Phone Letters
      • Restore IP
      • Rhonda Numbers
      • Roman Numerals
      • Solitaire Cipher
      • Water Towers
    • Generators
    • Hoon Errors
    • Hoon Style Guide
    • Implementing an Aura
    • Irregular forms
    • JSON
    • Limbs and wings
      • Limbs
      • Wings
    • Mips (Maps of Maps)
    • Parsing Text
    • Runes
      • | bar · Cores
      • $ buc · Structures
      • % cen · Calls
      • : col · Cells
      • . dot · Nock
      • / fas · Imports
      • ^ ket · Casts
      • + lus · Arms
      • ; mic · Make
      • ~ sig · Hints
      • = tis · Subject
      • ? wut · Conditionals
      • ! zap · Wild
      • Constants (Atoms and Strings)
      • --, == · Terminators
    • Sail (HTML)
    • Serialization
    • Sets
    • Standard Library
      • 1a: Basic Arithmetic
      • 1b: Tree Addressing
      • 1c: Molds and Mold-Builders
      • 2a: Unit Logic
      • 2b: List Logic
      • 2c: Bit Arithmetic
      • 2d: Bit Logic
      • 2e: Insecure Hashing
      • 2f: Noun Ordering
      • 2g: Unsigned Powers
      • 2h: Set Logic
      • 2i: Map Logic
      • 2j: Jar and Jug Logic
      • 2k: Queue Logic
      • 2l: Container from Container
      • 2m: Container from Noun
      • 2n: Functional Hacks
      • 2o: Normalizing Containers
      • 2p: Serialization
      • 2q: Molds and Mold-Builders
      • 3a: Modular and Signed Ints
      • 3b: Floating Point
      • 3c: Urbit Time
      • 3d: SHA Hash Family
      • 3e: AES encryption (Removed)
      • 3f: Scrambling
      • 3g: Molds and Mold-Builders
      • 4a: Exotic Bases
      • 4b: Text Processing
      • 4c: Tank Printer
      • 4d: Parsing (Tracing)
      • 4e: Parsing (Combinators)
      • 4f: Parsing (Rule-Builders)
      • 4g: Parsing (Outside Caller)
      • 4h: Parsing (ASCII Glyphs)
      • 4i: Parsing (Useful Idioms)
      • 4j: Parsing (Bases and Base Digits)
      • 4k: Atom Printing
      • 4l: Atom Parsing
      • 4m: Formatting Functions
      • 4n: Virtualization
      • 4o: Molds
      • 5a: Compiler Utilities
      • 5b: Macro Expansion
      • 5c: Compiler Backend & Prettyprinter
      • 5d: Parser
      • 5e: Molds and mold builders
      • 5f: Profiling support
    • Strings
    • The Engine Pattern
    • Udon (Markdown-esque)
    • Vases
    • Zuse
      • 2d(1-5): To JSON, Wains
      • 2d(6): From JSON
      • 2d(7): From JSON (unit)
      • 2e(2-3): Print & Parse JSON
      • 2m: Ordered Maps
  • Nock
    • What is Nock?
    • Decrement
    • Definition
    • Fast Hints and Jets
    • Implementations
    • Specification
  • User Manual
    • Contents
    • Running Urbit
      • Cloud Hosting
      • Home Servers
      • Runtime Reference
      • Self-hosting S3 Storage with MinIO
    • Urbit ID
      • Bridge Troubleshooting
      • Creating an Invite Pool
      • Get an Urbit ID
      • Guide to Factory Resets
      • HD Wallet (Master Ticket)
      • Layer 2 for planets
      • Layer 2 for stars
      • Proxies
      • Using Bridge
    • Urbit OS
      • Basics
      • Configuring S3 Storage
      • Dojo Tools
      • Filesystem
      • Shell
      • Ship Troubleshooting
      • Star and Galaxy Operations
      • Updates
Powered by GitBook

GitHub

  • Urbit ID
  • Urbit OS
  • Runtime

Resources

  • YouTube
  • Whitepaper
  • Awesome Urbit

Contact

  • X
  • Email
  • Gather
On this page
  • +so
  • ++bisk:so
  • ++crub:so
  • ++nuck:so
  • ++nusk:so
  • ++perd:so
  • ++royl:so
  • ++royl-rh:so
  • ++royl-rq:so
  • ++royl-rd:so
  • ++royl-rs:so
  • ++royl-rn:so
  • ++royl-cell:so
  • ++tash:so
  • ++twid:so
  • ++when:so
  • ++zust:so
Edit on GitHub
  1. Hoon
  2. Standard Library

4l: Atom Parsing

+so

Coin parser engine

Core containing arms that parse atoms encoded in strings.

Source

++  so
  ~%  %so  +  ~
  |%

++bisk:so

Parse aura-atom pair

Parsing rule. Parses an @u of any permitted base, producing a dime.

Source

++  bisk
  ~+
  ;~  pose
    ;~  pfix  (just '0')
      ;~  pose
        (stag %ub ;~(pfix (just 'b') bay:ag))
        (stag %uc ;~(pfix (just 'c') fim:ag))
        (stag %ui ;~(pfix (just 'i') dim:ag))
        (stag %ux ;~(pfix (just 'x') hex:ag))
        (stag %uv ;~(pfix (just 'v') viz:ag))
        (stag %uw ;~(pfix (just 'w') wiz:ag))
      ==
    ==
    (stag %ud dem:ag)
  ==

Examples

> (scan "25" bisk:so)
[%ud 25]

> (scan "0x12.6401" bisk:so)
[%ux 1.205.249]

++crub:so

Parse @da, @dr, @p, @t

Parsing rule. Parses any atom of any of the following auras after a leading sig: @da, @dr, @p, and @t. Produces a dime.

Source

++  crub
  ~+
  ;~  pose
    (cook |=(det=date `dime`[%da (year det)]) when)
  ::
    %+  cook
      |=  [a=(list [p=?(%d %h %m %s) q=@]) b=(list @)]
      =+  rop=`tarp`[0 0 0 0 b]
      |-  ^-  dime
      ?~  a
        [%dr (yule rop)]
      ?-  p.i.a
        %d  $(a t.a, d.rop (add q.i.a d.rop))
        %h  $(a t.a, h.rop (add q.i.a h.rop))
        %m  $(a t.a, m.rop (add q.i.a m.rop))
        %s  $(a t.a, s.rop (add q.i.a s.rop))
      ==
    ;~  plug
      %+  most
        dot
      ;~  pose
        ;~(pfix (just 'd') (stag %d dim:ag))
        ;~(pfix (just 'h') (stag %h dim:ag))
        ;~(pfix (just 'm') (stag %m dim:ag))
        ;~(pfix (just 's') (stag %s dim:ag))
      ==
      ;~(pose ;~(pfix ;~(plug dot dot) (most dot qix:ab)) (easy ~))
    ==
  ::
    (stag %p fed:ag)
    ;~(pfix dot (stag %ta urs:ab))
    ;~(pfix sig (stag %t urx:ab))
    ;~(pfix hep (stag %c (cook taft urx:ab)))
  ==

Examples

> (scan "1926.5.12" crub:so)
[p=~.da q=170.141.184.449.747.016.871.285.095.307.149.312.000]

> ;;([%da @da] (scan "1926.5.12" crub:so))
[%da ~1926.5.12]

> (scan "s10" crub:so)
[p=~.dr q=184.467.440.737.095.516.160]

> ;;([%dr @dr] (scan "s10" crub:so))
[%dr ~s10]

> (scan "sampel" crub:so)
[%p 1.135]

> (scan ".mas" crub:so)
[%ta 7.561.581]

++nuck:so

Top-level coin parser

Parsing rule. Switches on the first character and applies the corresponding coin parser.

Source

++  nuck
  ~/  %nuck  |=  a=nail  %.  a
  %+  knee  *coin  |.  ~+
  %-  stew
  ^.  stet  ^.  limo
  :~  :-  ['a' 'z']  (cook |=(a=@ta [%$ %tas a]) sym)
      :-  ['0' '9']  (stag %$ bisk)
      :-  '-'        (stag %$ tash)
      :-  '.'        ;~(pfix dot perd)
      :-  '~'        ;~(pfix sig ;~(pose twid (easy [%$ %n 0])))
  ==

Examples

> (scan "~pillyt" nuck:so)
[%$ p=[p=~.p q=13.184]]

> (scan "0x12" nuck:so)
[%$ p=[p=~.ux q=18]]

> (scan ".127.0.0.1" nuck:so)
[%$ p=[p=~.if q=2.130.706.433]]

> (scan "._20_0w25_sam__" nuck:so)
[ %many
    p
  ~[
    [%$ p=[p=~.ud q=20]]
    [%$ p=[p=~.uw q=133]]
    [%$ p=[p=~.tas q=7.168.371]]
  ]
]

++nusk:so

Parse coin literal with escapes

Parsing rule. Parses a coin literal with escapes.

Source

++  nusk
  ~+
  :(sear |=(a=@ta (rush a nuck)) wick urt:ab)

Examples

> ~.asd_a
~.asd_a

> ._1_~~.asd~-a__
[1 ~.asd_a]

> (scan "~~.asd~-a" nusk:so)
[%$ p=[p=~.ta q=418.212.246.369]]

++perd:so

Parsing coin literal without prefixes

Parsing rule. Parses a dime or tuple without their respective standard prefixes.

Source

++  perd
  ~+
  ;~  pose
    (stag %$ zust)
    (stag %many (ifix [cab ;~(plug cab cab)] (more cab nusk)))
  ==

Examples

> (scan "y" perd:so)
[%$ [%f %.y]]

> (scan "n" perd:so)
[%$ [%f %.n]]

> (scan "_20_x__" perd:so)
[%many [[%$ p=[p=~.ud q=20]] [i=[%$ p=[p=~.tas q=120]] t=~]]]

++royl:so

Parse dime float

Parsing rule. Parses a number into a dime float.

Source

++  royl
  ~+
  ;~  pose
    (stag %rh royl-rh)
    (stag %rq royl-rq)
    (stag %rd royl-rd)
    (stag %rs royl-rs)
  ==

Examples

> (scan "~3.14" royl:so)
[%rd .~3.14]

> (scan "3.14" royl:so)
[%rs .3.14]

++royl-rh:so

Parse half-precision float

Parsing rule. Parses a @rh.

Source

++  royl-rh  (cook rylh ;~(pfix ;~(plug sig sig) (cook royl-cell royl-rn)))

Examples

> (scan "~~3.14" royl-rh:so)
.~~3.14

++royl-rq:so

Parse quad-precision float

Parsing rule. Parses a @rq.

Source

++  royl-rq  (cook rylq ;~(pfix ;~(plug sig sig sig) (cook royl-cell royl-rn)))

Examples

> (scan "~~~3.14" royl-rq:so)
.~~~3.14

++royl-rd:so

Parse double-precision float

Parsing rule. Parses a @rd.

Source

++  royl-rd  (cook ryld ;~(pfix sig (cook royl-cell royl-rn)))

Examples

> (scan "~3.14" royl-rd:so)
.~3.14

++royl-rs:so

Parse single-precision float

Parsing rule. Parses a @rs.

Source

++  royl-rs  (cook ryls (cook royl-cell royl-rn))

Examples

> (scan "3.14" royl-rs:so)
.3.14

++royl-rn:so

Parse real number

Parsing rule. Parses a real number to a ++rn.

Source

++  royl-rn
  =/  moo
    |=  a=tape
    :-  (lent a)
    (scan a (bass 10 (plus sid:ab)))
  ;~  pose
    ;~  plug
      (easy %d)
      ;~(pose (cold | hep) (easy &))
      ;~  plug  dim:ag
        ;~  pose
          ;~(pfix dot (cook moo (plus (shim '0' '9'))))
          (easy [0 0])
        ==
        ;~  pose
          ;~  pfix
            (just 'e')
            ;~(plug ;~(pose (cold | hep) (easy &)) dim:ag)
          ==
          (easy [& 0])
        ==
      ==
    ==
    ::
    ;~  plug
      (easy %i)
      ;~  sfix
        ;~(pose (cold | hep) (easy &))
        (jest 'inf')
      ==
    ==
    ::
    ;~  plug
      (easy %n)
      (cold ~ (jest 'nan'))
    ==
  ==

Examples

> (scan "3.14" royl-rn:so)
[%d %.y 3 [2 14] [%.y 0]]

> (scan "-3.14e-39" royl-rn:so)
[%d %.n 3 [2 14] [%.n 39]]

> (scan "3" royl-rn:so)
[%d %.y 3 [0 0] [%.y 0]]

++royl-cell:so

Convert rn to dn

Intermediate parsed float converter. Convert a ++rn to ++dn.

Accepts

A ++rn.

Produces

A ++dn.

Source

++  royl-cell
  |=  rn
  ^-  dn
  ?.  ?=([%d *] +<)  +<
  =+  ^=  h
    (dif:si (new:si f.b i.b) (sun:si d.b))
  [%d a h (add (mul c.b (pow 10 d.b)) e.b)]

Examples

> (royl-cell:so (scan "3.14" royl-rn:so))
[%d s=%.y e=-2 a=314]

> (ryls (royl-cell:so (scan "3.14" royl-rn:so)))
.3.14

++tash:so

Parse signed dime

Parsing rule. Parse a @s to a dime.

Source

++  tash
  ~+
  =+  ^=  neg
      |=  [syn=? mol=dime]  ^-  dime
      ?>  =('u' (end 3 p.mol))
      [(cat 3 's' (rsh 3 p.mol)) (new:si syn q.mol)]
  ;~  pfix  hep
    ;~  pose
      (cook |=(a=dime (neg | a)) bisk)
      ;~(pfix hep (cook |=(a=dime (neg & a)) bisk))
    ==
  ==

Examples

> (scan "-20" tash:so)
[p=~.sd q=39]

> ;;([%sd @sd] (scan "-20" tash:so))
[%sd -20]

> ;;([%sd @sd] (scan "--20" tash:so))
[%sd --20]

> ;;([%sx @sx] (scan "--0x2e" tash:so))
[%sx --0x2e]

++twid:so

Parse coins without ~ prefix

Parsing rule. Parses coins after a leading sig, ~.

Source

++  twid
  ~+
  ;~  pose
    %+  stag  %blob
    %+  sear  |=(a=@ (mole |.((cue a))))
    ;~(pfix (just '0') vum:ag)
  ::
    (stag %$ crub)
  ==

Examples

> (scan "zod" twid:so)
[%$ [%p 0]]

> (scan ".sam" twid:so)
[%$ [%ta 7.168.371]]

> (scan "0ph" twid:so)
[%blob [1 1]]

++when:so

Parse date

Parsing rule. Parse a @da-formatted date string (sans the leading ~) to a date.

Source

++  when
  ~+
  ;~  plug
    %+  cook
      |=([a=@ b=?] [b a])
    ;~(plug dim:ag ;~(pose (cold | hep) (easy &)))
    ;~(pfix dot mot:ag)   ::  month
    ;~(pfix dot dip:ag)   ::  day
    ;~  pose
      ;~  pfix
        ;~(plug dot dot)
        ;~  plug
          dum:ag
          ;~(pfix dot dum:ag)
          ;~(pfix dot dum:ag)
          ;~(pose ;~(pfix ;~(plug dot dot) (most dot qix:ab)) (easy ~))
        ==
      ==
      (easy [0 0 0 ~])
    ==
  ==

Examples

> `date`(scan "2000.1.1..12.00.00..ffff" when:so)
[[a=%.y y=2.000] m=1 t=[d=1 h=12 m=0 s=0 f=~[0xffff]]]

++zust:so

Parse dimes from @i, @f, @r or @q

Parsing rule. Parses an atom of either @if (IP address), @f (loobean), @r (floating point) into a dime. The @q alone requires a leading ~.

Source

++  zust
  ~+
  ;~  pose
    (stag %is bip:ag)
    (stag %if lip:ag)
    royl
    (stag %f ;~(pose (cold & (just 'y')) (cold | (just 'n'))))
    (stag %q ;~(pfix sig feq:ag))
  ==

Examples

> (scan "~sampel" zust:so)
[%q 1.135]

> (scan "y" zust:so)
[%f %.y]

> (scan "127.0.0.1" zust:so)
[%if 2.130.706.433]

> (scan "af.0.0.0.0.e7a5.30d2.7" zust:so)
[%is 908.651.950.243.594.834.993.091.554.288.205.831]

> (scan "12.09" zust:so)
[%rs .12.09]

Previous4k: Atom PrintingNext4m: Formatting Functions

Last updated 1 day ago