惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
News and Events Feed by Topic
S
Security Affairs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cloudbric
Cloudbric
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
Jina AI
Jina AI
罗磊的独立博客
GbyAI
GbyAI
I
InfoQ
aimingoo的专栏
aimingoo的专栏
Attack and Defense Labs
Attack and Defense Labs
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MyScale Blog
MyScale Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
U
Unit 42
H
Heimdal Security Blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
PCI Perspectives
PCI Perspectives
V
Visual Studio Blog
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
博客园 - 司徒正美
W
WeLiveSecurity
TaoSecurity Blog
TaoSecurity Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
AI
AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security @ Cisco Blogs
V2EX - 技术
V2EX - 技术
Schneier on Security
Schneier on Security
N
News | PayPal Newsroom
S
Secure Thoughts
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Troy Hunt's Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Vulnerabilities – Threatpost

Hacker News: Front Page

Trump administration reclassifies cannabis as less dangerous Release raylib v6.0 · raysan5/raylib GitHub - russellromney/honker: SQLite extension + bindings for Postgres NOTIFY/LISTEN semantics with durable queues, streams, pub/sub, and scheduler Writing a C Compiler, in Zig crawshaw - 2026-04-22 MacBook Neo and How the iPad Should Be It's time to reclaim the word "Palantir" for J.R.R. Tolkien Arch Linux now has a bit-for-bit reproducible Docker image Fundamental Theorem of Calculus | David Álvarez Rosa | Personal Website Bring Your Agent to Teams Ars Technica newsroom AI policy France confirms data breach at government agency that manages citizens’ IDs New study compares growing corn for energy to solar production. It's no contest NAEP Long-Term Trend Assessment Results: Reading and Mathematics Convergent Evolution: How Different Language Models Learn Similar Number Representations We Found a Stable Firefox Identifier Linking All Your Private Tor Identities GitHub - besimple-oss/broccoli: Broccoli turns Linear tickets into shipped PRs — powered by Claude and Codex, running on your own Google Cloud. Youth Suicides Declined After Creation of National Hotline Top MAGA influencer revealed to be AI — created by a guy in India who made a mint off lonely men online Ping-pong robot beats top-level human players Announcing DuckDB 1.5.2 The handmade beauty of Machine Age data visualizations Treetops glowing during storms captured on film for first time Columnar Storage is Normalization TPU 8t and TPU 8i technical deep dive Our eighth generation TPUs: two chips for the agentic era Introducing Google Cloud Fraud Defense, the next evolution of reCAPTCHA | Google Cloud Blog Kernel code removals driven by LLM-created security reports tante.cc Nobody Got Fired for Uber's $8 Million Ledger Mistake? Introducing workspace agents in ChatGPT Sure, xor’ing a register with itself is the idiom for zeroing it out, but why not sub? What Async Promised and What it Delivered — Causality GitHub - justrach/kuri: Browser automation and web crawling for AI agents. Zig-native, token-efficient CDP snapshots, HAR recording, and a standalone fetcher. Drunk Post: Things I’ve Learned as a Senior Engineer Claude Code to be removed from Anthropic's Pro plan? Another Day Has Come 'Something sinister could be happening': FBI looks into dead or missing nuclear and space defense scientists tied to NASA, Blue Origin, and SpaceX | Fortune GitHub - calcom/cal.diy: Scheduling infrastructure for absolutely everyone. Meta to start capturing employee mouse movements, keystrokes for AI training The Vercel Breach: OAuth Supply Chain Attack Exposes the Hidden Risk in Platform Environment Variables Member of Technical Staff, Product Engineering (full-time) at Trellis AI | Y Combinator CATL's new LFP battery can charge from 10 to 98% in less than 7 minutes Jobs at Bloom | Y Combinator The printing press for biological data (Sterling Hooten) Brussels launched an age checking app. Hackers took 2 minutes to break it Inside GitHub's Fake Star Economy The Illuminated Man by Christopher Priest and Nina Allan review – an unconventional portrait of JG Ballard IEA: Solar overtakes all energy sources in a major global first Stripe’s payments APIs: The first 10 years GitHub - esutcu/planb-lpm GitHub - browser-use/browser-harness: Self-healing browser harness that enables LLMs to complete any task. Claude Token Counter, now with model comparisons GitHub - shivampkumar/trellis-mac Six levels of dark mode The Bromine Chokepoint: How Strife in the Middle East Could Halt Production of the World’s Memory Chips Turtle WoW classic server announces shutdown after Blizzard wins injunction Scoring 500 Show HN pages for AI design patterns Vercel April 2026 security incident | Vercel Knowledge Base Dubai police arrest airline worker after accessing private WhatsApp group Prompt → Diagram — Gemma 4 E2B in desktop Chrome (WebGPU) Binary GCD - Algorithmica madhadron - The seven programming ur-languages Keep Pushing: We Get 10 More Days to Reform Section 702 The world in which IPv6 was a good design Zero-Copy GPU Inference from WebAssembly on Apple Silicon The RAM shortage could last years Any Color You Like: NIST Scientists Create ‘Any Wavelength’ Lasers in Tiny Circuits for Light Optimizing Ruby Path Methods A college instructor turns to typewriters to curb AI-written work and teach life lessons UpCodes | Careers The electromechanical angle computer inside the B-52 bomber's star tracker Why Japan has such good railways - Works in Progress Magazine State of Kdenlive - 2026 GitHub - smol-machines/smolvm: Tool to build & run portable, lightweight, self-contained virtual machines. Head of Engineering at Kyber | Y Combinator GitHub - paniclock/paniclock: Instantly disable Touch ID and lock your Mac with one click or keyboard shortcut. Detecting DOSBox from within the Box I Measured Claude 4.7's New Tokenizer. Here's What It Costs You. Introducing Claude Design by Anthropic Labs Middle schooler finds coin from Troy in Berlin It Is Time to Ban the Sale of Precise Geolocation Isaac Asimov: The Last Question Teddy Roosevelt and Abraham Lincoln in the same photo Healthchecks.io Now Uses Self-hosted Object Storage Bluesky has been dealing with a DDoS attack for nearly a full day. Harness Engineer at Substrate | Y Combinator GitHub - dacracot/Klondike3-Simulator SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Email could have been X.400 times better Newly unsealed records reveal Amazon’s price-fixing tactics, California attorney general claims GitHub - GainSec/AutoProber: Hardware hacker’s flying probe automation stack for agent-driven target discovery, microscope mapping, safety-monitored CNC motion, probe review, and controlled pin probing. A Better R Programming Experience Thanks to Tree-sitter Clojure - Documentary GPT‑Rosalind for life sciences research How a Tiny Yellow Handheld Changed How Duke University Teaches Game Design - Playdate News Android CLI and skills: Build Android apps 3x faster using any agent Qwen3.6-35B-A3B on my laptop drew me a better pelican than Claude Opus 4.7 Codex for almost everything GitHub - GRVYDEV/marky: A lightweight easy to use markdown viewer
GitHub - glojurelang/glojure: Clojure interpreter hosted on Go, with extensible interop support.
dnlo · 2026-06-18 · via Hacker News: Front Page

example workflow

Try it in your browser!

Gopher image

Gopher image derived from @egonelbre, licensed under Creative Commons 1.0 Attributions license.

Glojure is an interpreter for Clojure, hosted on Go. Glojure provides easy access to Go libraries, similar to how Clojure provides easy access to Java frameworks.

Glojure is in early development; expect bugs, missing features, and limited performance. Backwards compatibility is not guaranteed until a v1 release. That said, it is used successfully in hobby projects and runs a significant subset of the (transformed) core Clojure library.

Note that unlike most other Go implementations of Clojure, Glojure is a "hosted" language - a term used to describe languages that are implemented in terms of a host language (in this case, Go). This means that all Go values can be used as Glojure values and vice versa.

Prerequisites

Before you get started with Glojure, make sure you have installed and have knowledge of Go (version 1.19 or higher).

Installation

Glojure is currently available from source for all platforms where Go can run, and it requires at least go 1.24.

Install it with the go install command:

$ go install github.com/glojurelang/glojure/cmd/glj@latest

After installation, you can start the REPL (Read-Eval-Print-Loop) with the glj command:

$ glj
user=> (println "Hello, world!")
Hello, world!
nil
user=>

Usage

Glojure can be used in two ways: as a standalone command-line tool (glj) or embedded within Go applications.

Using the glj Command

The glj command provides a traditional Clojure development experience:

Show the help:

Show the version:

$ glj --version
glojure v0.3.0

Start a REPL (interactive session):

user=> *glojure-version*
{:major 0, :minor 3, :incremental 0, :qualifier nil}
$ glj
user=> (+ 1 2 3)
6
user=> (println "Hello from Glojure!")
Hello from Glojure!
nil

REPL Features

The interactive REPL includes:

  • Vi and emacs editing modes -- vi is the default; configure via ~/.inputrc
  • Multiline editing -- incomplete expressions continue on the next line with auto-indent
  • Tab completion -- symbols, namespaces, and aliases with descriptive labels
  • Smart indentation -- Tab inserts 2 spaces; Backspace removes a full indent level
  • Persistent history -- saved to ~/.glj_history across sessions
  • Bracketed paste -- paste blocks of code instantly
  • Job control -- Ctrl+Z suspends, fg resumes cleanly
  • Interrupt -- Ctrl+C cancels input or interrupts evaluation

Evaluate expressions:

$ glj -e '(println "Hello, World!")'
Hello, World!
$ glj -e '(apply + (range 3 10))'
42
$ glj -e '
(defn factorial [n] (if (<= n 1) 1 (* n (factorial (dec n)))))
(factorial 5)'
120

Run a Clojure script:

;; hello.glj
(println "Hello," (first *command-line-args*))
$ glj hello.glj World
Hello, World

Create executable programs:

;; server.glj
(ns example.server)

(defn echo-handler
  [w r]
  (io.Copy w (.Body r))
  nil)

(net:http.Handle "/" (net:http.HandlerFunc echo-handler))
(println "Server starting on :8080...")
(net:http.ListenAndServe ":8080" nil)
$ glj server.glj
Server starting on :8080...

Embedding Glojure in Go Applications

You can also embed Glojure as a scripting language within your Go applications. This is useful when you want to:

  • Add scriptable configuration to your Go application
  • Allow users to extend your application with Clojure plugins
  • Mix Go's performance with Clojure's expressiveness
  • Control the execution environment (custom I/O, sandboxing)

Basic embedding example:

package main

import (
    "fmt"
    _ "github.com/glojurelang/glojure/pkg/glj"  // Initialize Glojure
    "github.com/glojurelang/glojure/pkg/runtime"
)

func main() {
    // Evaluate Clojure code
    result := runtime.ReadEval(`
        (defn factorial [n]
          (if (<= n 1)
            1
            (* n (factorial (dec n)))))
        (factorial 5)
    `)
    fmt.Printf("5! = %v\n", result) // 5! = 120
}

Calling Go from Clojure and vice versa:

package main

import (
    "fmt"
    "github.com/glojurelang/glojure/pkg/glj"
    "github.com/glojurelang/glojure/pkg/runtime"
)

// Define a Go function
func greet(name string) string {
    return fmt.Sprintf("Hello, %s from Go!", name)
}

func main() {
    // Make the Go function available to Clojure
    runtime.ReadEval(`(def greet-from-go nil)`) // placeholder
    greetVar := glj.Var("user", "greet-from-go")
    greetVar.SetRoot(greet)

    // Use it from Clojure
    result := runtime.ReadEval(`(greet-from-go "Clojure")`)
    fmt.Println(result) // "Hello, Clojure from Go!"

    // Call a Clojure function from Go
    runtime.ReadEval(`(defn add [x y] (+ x y))`)
    addFn := glj.Var("user", "add")
    sum := addFn.Invoke(10, 32)
    fmt.Printf("Sum: %v\n", sum) // Sum: 42
}

Accessing your own Go packages:

When embedding Glojure, you can also expose your own Go packages or additional standard library packages using the package map approach described in the Accessing additional Go packages section below. This allows embedded Clojure code to access any Go packages you choose to expose:

import (
    _ "github.com/glojurelang/glojure/pkg/glj"
    _ "your.app/gljimports" // Your generated package map
)

// Now Clojure code can access your exposed packages
runtime.ReadEval(`
    (your$package.YourFunction "arg")
    (another$package.Method)
`)

When to Use Each Approach

Use glj command for:

  • Writing standalone Clojure programs
  • Interactive development with the REPL
  • Running Clojure scripts
  • Evaluating expressions directly from the command line
  • Learning Clojure with Go interop

Embed Glojure for:

  • Adding scripting to an existing Go application
  • Building a platform that users extend with Clojure
  • Custom control over the Glojure execution environment
  • Mixing Go and Clojure in a single binary

Interop

Glojure ships with interop with many standard library packages out-of-the-box. Go package names are munged to avoid ambiguity with the use of / to refer to namespaced symbols; instances of / in package names are replaced with :. Here's a simple example:

user=> (println (fmt.Sprintf "A couple of HTTP methods: %v" [net:http.MethodGet net:http.MethodPost]))
A couple of HTTP methods: ["GET" "POST"]
nil

The following standard library packages are included by default:

  • bytes
  • context
  • errors
  • flag
  • fmt
  • io
  • io/fs
  • io/ioutil
  • math
  • math/big
  • math/rand
  • net/http
  • os
  • os/exec
  • os/signal
  • regexp
  • reflect
  • sort
  • strconv
  • strings
  • sync
  • sync/atomic
  • time
  • unicode

To expose additional packages, you must generate a "package map" and compile your own executable that imports both your package map and the Glojure API. See the section below for more details.

Expect improvements to both the availability of standard library packages and interop workflows.

Accessing additional Go packages

The gen-import-interop can be used to emit the contents of a .go file that will export a function that can be used to add the exports of additional packages to the Glojure package map.

$ go run github.com/glojurelang/glojure/cmd/gen-import-interop \
     -packages=:comma-separated-package-list: \
     > your/package/gljimports/my_package_map.go

Then, in your own program:

package main

import (
	// Add your packages' exports to the pkgmap.
	_ "your.package/gljimports"
)

// ...

Differences from Clojure

Numbers

Clojure Type Glojure Type Notes
long int64
double float64
float float32
byte byte Note that Go bytes are unsigned, whereas JVM bytes are signed.
short int16
int int Note that JVM ints are 32-bit, whereas Go ints are 32- or 64-bit depending on the platform.
char lang.Char The Glojure type is a tagged rune (type Char rune). JVM chars are 16-bit whereas Go runes are 32-bit.
BigInt *lang.BigInt The Glojure type wraps *big.Int.
BigDecimal *lang.BigDecimal The Glojure type wraps *big.Float.
Ratio *lang.Ratio The Glojure type wraps *big.Rat.
BigInteger *big.Int Native JVM BigInteger corresponds to *big.Int.

Comparisons to other Go ports of Clojure

Aspect Glojure Joker let-go
Hosted1 Yes No No
Extensible Go interop Yes No No
Concurrency Yes Yes (with GIL) Yes
Clojure tooling (e.g. linter) No Yes No
Execution Tree-walk interpreter Tree-walk interpreter Bytecode Interpreter

If you'd like to see another port in this table, or if you believe there is an error in it, please file an issue or open a pull request!

  1. What does it mean to be a hosted language? For Clojure on the JVM, it means that all Java values are also Clojure values, and vice versa. Glojure strives to maintain the same relationship with Go. ↩