Skip to content

Why pure Go

go-ruby-scanf/scanf reimplements Ruby's scanf in pure Go, with cgo disabled. The slice of Ruby it covers is deterministic and interpreter-independent: scanning an input string against a scanf format grammar — the directives, widths, character-class sets, suppression flag, and literal/whitespace matching — is a pure function of its inputs, with no live binding and no evaluation of arbitrary Ruby. That is exactly the part that can — and should — live as a standalone Go library, separate from the interpreter.

Extracted from rbgo, reusable by anyone

This library began life inside go-embedded-ruby's rbgo. It has been made a reusable standalone library so that:

  • any Go program can import github.com/go-ruby-scanf/scanf directly, with no Ruby runtime;
  • the dependency runs the other way — rbgo binds this module as a native module (the same pattern as go-ruby-regexp and go-ruby-erb), rather than this module depending on the interpreter;
  • the behaviour is pinned by a differential oracle against the system ruby (String#scanf), independent of any one consumer.

It hands back a small, explicit value model (int / *big.Int / float64 / string, the natural mapping of Ruby's Integer / Float / String) that the host binds to its own objects.

Why pure Go matters here

Because the library is CGO-free and dependency-free, it:

  • cross-compiles to every Go target with no C toolchain, and links into a single static binary;
  • has no dependency on the Ruby runtime — the dependency runs the other way;
  • can be differentially tested against the ruby binary wherever one is on PATH, while the cross-arch lanes (where ruby is absent) still validate the library itself.

See Usage & API for the surface and Roadmap for what is in scope.