Wednesday, February 04, 2026

AI tools: Gemini CLI vs Antigravity

Google made it confusing... most likely since Antigravity was not planned, but emerged from acquiring Windsurf team... The benefit of both is easy and free access to Gemini AI, while Antigravity also includes (limited free) support for Anthropic models. 

Gemini CLI and Antigravity are both Google-powered AI development tools,
but they serve different purposes:
  • Gemini CLI is a terminal-based assistant for quick tasks and command-driven workflows, while
  • Anti-Gravity is a full, agentic IDE environment designed for comprehensive, multi-file project management and autonomous coding. 
Anti-Gravity excels in complex, multi-part projects, acting like a team member that can navigate codebases, while Gemini CLI works best for focused, developer-supervised tasks.

NEW Gemini CLI 2.0 Update is INSANE (FREE!) - YouTube

Gemini CLI is an open-source AI agent that brings the power of Gemini directly into your terminal. It is designed to be a terminal-first, extensible, and powerful tool for developers, engineers, SREs, and beyond.

Gemini CLI integrates with your local environment. It can read and edit files, execute shell commands, and search the web, all while maintaining your project context.

Gemini CLI installation, execution, and deployment | Gemini CLI

npm install -g @google/gemini-cli

gemini

or

npx @google/gemini-cli


Gemini CLI + VS Code: Native diffing and context-aware workflows - Google Developers Blog

Gemini Code Assist - Visual Studio Marketplace

lang. code == data : Homoiconicity

what other languages can express code in native data format, like lisp does?

The technical term for this property is Homoiconicity (from Greek: "same representation").
It means the program's source code is written using the language's own data structures.

While Lisp (using Lists) is the most famous example,
several other languages achieve this using different data structures.

Here are the most notable ones:

1. Rebol (and its successor, Red)

The Data Structure: Blocks Rebol was specifically designed to be a "data exchange language." Unlike Lisp's parentheses, Rebol uses square brackets [] to denote Blocks.

  • Code: if true [ print "Hello" ]
  • Data: [ "User" "Bob" age 30 ]

In Rebol, there is no distinction between code and data until you "evaluate" it. It also has native types for email, URLs, and money, making it richer than Lisp in terms of literals.

data: [ print "I am code" ]
do data  ;; Executes the block

2. Tcl (Tool Command Language)

The Data Structure: Strings In Tcl, everything is a string. A list is just a string with spaces. A command is just a string.

  • Code: set x 10
  • Data: "set x 10"

Because the language is purely string substitution, you can compose code by simply manipulating strings.

set cmd "puts"
append cmd " {Hello World}"
eval $cmd  ;# Executes the string as code

3. Forth (and Factor)

The Data Structure: The Stack and Dictionary Forth code is a sequence of words separated by spaces. The "data" is the dictionary of defined words.

  • Code: 1 2 + . (Pushes 1, pushes 2, adds them, prints result).
  • Data: The sequence 1 2 + . is just a list of tokens.

You can read the input stream and compile new words on the fly. It feels different from Lisp because it is postfix (Reverse Polish Notation), but it is equally homoiconic.

4. Prolog

The Data Structure: Terms (Facts and Rules) Prolog source code consists of "terms," which are the exact same structures used to represent data in its database.

  • Code: parent(john, jim).
  • Data: parent(john, jim).

You can query the code itself using the same mechanisms you use to query data (clause/2).

5. Julia (Modern Homoiconicity)

The Data Structure: AST (Abstract Syntax Tree) Objects Julia looks like Python or Matlab (infix syntax), so it doesn't look homoiconic at first glance. However, it is fully homoiconic because it allows you to access the compiler's parsed representation of the code as a native Expression object.

You use the colon : to treat code as data.

# This is code
x = 1 + 2

# This is data (an Expression object)
expr = :( 1 + 2 )

# You can manipulate the tree
expr.args[1] = :*  # Change + to *
eval(expr)         # Returns 2 (because 1 * 2)

6. XSLT

The Data Structure: XML It is often hated for its verbosity, but XSLT is a perfect example.

  • Data: XML.
  • Code: XML.

You write the transformation rules using the exact same syntax tags (<xsl:template>) as the data you are manipulating.

Summary: The "Shape" of the Data

LanguageCode is represented as...Syntax Style
Lisp / SchemeLists (Cons cells)(func arg1 arg2)
Rebol / RedBlocks (Arrays of values)func [arg1 arg2]
TclStringsfunc arg1 arg2
ForthWord Sequencesarg1 arg2 func
PrologTerms (Predicates)func(arg1, arg2).
JuliaAST Objects:(func(arg1, arg2))
XSLTDOM Trees (XML)<func><arg1/><arg2/></func>

Homoiconicity is a programming language feature where programs are represented using the language's own data structures, allowing code to be treated as data and manipulated by the language itself, often summarized as "code is data" or "data is code". This property, prominent in Lisp dialects, simplifies metaprogramming and powerful macros by treating abstract syntax trees (ASTs) as native lists or other fundamental types, enabling self-modification and reflection. While conceptually powerful (e.g., (define (foo x) (* x x)) is both code and a list in Scheme), the term lacks a strict definition and is debated, with some arguing it's too broad or doesn't truly exist in a pure sense. 
Key Aspects:
  • "Same Representation": From Greek homo- (same) and icon (representation).
  • Code as Data: Programs' internal structure (like syntax trees) mirrors the language's basic data types (like lists or S-expressions).
  • Metaprogramming: Makes it easier to write code that writes or modifies other code (macros, reflection).
  • Lisp Family: Languages like Lisp, Scheme, and Clojure are classic examples due to their S-expression syntax. 
Example (Scheme/Lisp):
  • '(define (square x) (* x x)) is a list (data).
  • (define (square x) (* x x)) is a function definition (code). 
Debate & Nuance:
  • Informal Term: There's no single, agreed-upon formal definition, leading to debate.
  • Too Broad?: Some argue that any language with strings or generic data structures could be considered weakly homoiconic, making the term less meaningful.
  • Focus on Macros: The real power often highlighted isn't just representation but the seamless integration for powerful macro systems, say developers at Reddit.