Domain-Specific Languages (DSLs)
Table of Contents
1. Background
A Domain-Specific Language (DSL) is a programming language specialized for a particular application domain. Unlike general-purpose languages, DSLs trade generality for expressiveness in their domain.
1.1. Types of DSLs
| Type | Description | Examples |
|---|---|---|
| External | Standalone syntax and parser | SQL, CSS, Regular expressions |
| Internal | Embedded in host language | RSpec (Ruby), Gradle (Groovy) |
| Fluent | Method chaining APIs | jQuery, Builder patterns |
2. Examples in Practice
2.1. SQL - Database Queries
SELECT users.name, COUNT(orders.id) as order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE users.active = true
GROUP BY users.id
HAVING order_count > 5
ORDER BY order_count DESC;
2.2. Regular Expressions - Pattern Matching
import re
# Match email addresses
pattern = r'^[\w.-]+@[\w.-]+\.\w+$'
re.match(pattern, 'user@example.com')
2.3. CSS - Styling
.card {
display: flex;
flex-direction: column;
padding: 1rem;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
2.4. Make - Build Automation
build: deps
@echo "Building..."
cargo build --release
test: build
cargo test
deps:
cargo fetch
3. Embedded DSLs
Languages with powerful metaprogramming enable internal DSLs:
3.1. Clojure (Hiccup for HTML)
[:div {:class "container"}
[:h1 "Welcome"]
[:ul
(for [item items]
[:li {:key (:id item)} (:name item)])]]
3.2. Ruby (RSpec for Testing)
describe Calculator do
it "adds two numbers" do
expect(Calculator.add(2, 3)).to eq(5)
end
it "multiplies two numbers" do
expect(Calculator.multiply(3, 4)).to eq(12)
end
end
4. Design Considerations
- Expressiveness: Minimize boilerplate for domain tasks
- Safety: Constrain operations to valid domain operations
- Tooling: IDE support, error messages, debugging
- Learning curve: Balance power with simplicity