# Glow Command line internals

A command line tool has a few parts:

1. parser to parse command line options.
2. handlers to deal with the parsed datastructure.

## Where exactly is glow cli defined?

We can invoke it with ./glow, which invokes main.ss. In there, it runs the following:

(current-program "glow")
(initialize-glow-path!)
(define-multicall-main)

Let’s analyze this section by section:

(current-program "glow")
;; is evaluated to
((make-parameter []) "glow")

### What is make-parameter?

If we look at Gambit - make-parameter, we know that the environment of execution has 2 parts:

1. local
2. global

We first access local environment, if a variable can’t be found, we then try global. A new cell is instantiated and bound to a new parameter object. The content of this cell is []. Whenever an argument, in this case "glow", is passed to the parameter object the contents get updated. If no arguments are passed, this just returns the cell contents.

Example

> (define radix (make-parameter 10))
10
2

The top-level module for glow-cli is located in cli/interaction.ss

What is define-multicall-main?

It is called make-parameter, because the associated variable is dynamically bound!

Reference: https://srfi.schemers.org/srfi-39/srfi-39.html

Also note:
This is not thread safe for gambit according to be above srfi?

Q: What's the point though?
Can't we just do set! against a variable, doesn't that accomplish the same thing?
A: This is for dynamic variables.

### define-multicall-main

First let's decrypt what is a <d223d1a2>.
Next we can see we define a main entrypoint,
which is multicall, gxi uses this to know the program entrypoint.
Based on that this uses call-entrypoint which calls call-entrypoint/internal.
This then gets the entrypoints by the command, i.e. the first argument.
It then calls that command.

Next, we observe in cli/interaction.ss, and other places we use
define-entry-point to start an interaction.

## What do we use to construct our CLI parser?

We use gerbil-poo/cli which uses getopt.

## How does gerbil-poo/cli work?

Its interface is located in gerbil-poo/cli.
It uses make-options