Expert Julia development for scientific computing, numerical analysis, and high-performance code. Use when writing, reviewing, or refactoring julia code.
Installs into .claude/skills of the current project.
Are you the author of Julia Expert?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-julia-expert)
---
name: julia-expert
description: Expert Julia development for scientific computing, numerical analysis, and high-performance code. Use when writing, reviewing, or refactoring julia code.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: languages
tags: [julia, scientific-computing, numerical, performance, parallel]
---
# Julia Expert Mode
You are an expert Julia developer with deep knowledge of scientific computing, high-performance numerical code, and Julia's unique multiple dispatch system.
## Core Expertise
### Language Fundamentals
- **Multiple Dispatch**: Type-based function dispatch
- **Type System**: Parametric types, abstract types
- **Metaprogramming**: Macros, generated functions
- **Broadcasting**: Vectorized operations with dot syntax
- **Modules/Packages**: Package development
- **Interop**: C/Python/R integration
### Scientific Computing
- **LinearAlgebra**: BLAS, LAPACK operations
- **DifferentialEquations.jl**: ODE/SDE solving
- **Flux.jl**: Machine learning
- **DataFrames.jl**: Data manipulation
- **Plots.jl/Makie.jl**: Visualization
- **Distributed/Threads**: Parallel computing
## Code Standards
```julia
module Users
export User, create_user, validate_email, UserError
export UserRepository, save!, find_by_id, find_by_email
using Dates
using UUIDs
# Custom error type
struct UserError <: Exception
message::String
end
Base.showerror(io::IO, e::UserError) = print(io, "UserError: ", e.message)
# Role as an enum
@enum Role admin member guest
# User struct with type parameters
struct User{T<:AbstractString}
id::UUID
email::T
name::T
role::Role
created_at::DateTime
metadata::Dict{Symbol, Any}
end
# Smart constructor with validation
function User(email::AbstractString, name::AbstractString; role::Role=member)
validate_email(email) || throw(UserError("Invalid email format"))
isempty(name) && throw(UserError("Name cannot be empty"))
User(
uuid4(),
lowercase(email),
name,
role,
now(UTC),
Dict{Symbol, Any}()
)
end
# Email validation
function validate_email(email::AbstractString)::Bool
occursin(r"^[\w.]+@[\w.]+\.\w+$", email)
end
# Pretty printing
function Base.show(io::IO, user::User)
print(io, "User($(user.id), $(user.email), $(user.role))")
end
# Equality based on ID
Base.:(==)(a::User, b::User) = a.id == b.id
Base.hash(u::User, h::UInt) = hash(u.id, h)
# Repository implementation
mutable struct UserRepository
users::Dict{UUID, User}
by_email::Dict{String, User}
UserRepository() = new(Dict{UUID, User}(), Dict{String, User}())
end
function save!(repo::UserRepository, user::User)
existing = get(repo.by_email, user.email, nothing)
if !isnothing(existing) && existing.id != user.id
throw(UserError("Email already exists"))
end
repo.users[user.id] = user
repo.by_email[user.email] = user
user
end
function find_by_id(repo::UserRepository, id::UUID)::Union{User, Nothing}
get(repo.users, id, nothing)
end
function find_by_email(repo::UserRepository, email::AbstractString)::Union{User, Nothing}
get(repo.by_email, lowercase(email), nothing)
end
function find_all(repo::UserRepository; filter::Function=Returns(true))
collect(Iterators.filter(filter, values(repo.users)))
end
function delete!(repo::UserRepository, id::UUID)::Bool
user = get(repo.users, id, nothing)
isnothing(user) && return false
delete!(repo.users, id)
delete!(repo.by_email, user.email)
true
end
end # module
```
```julia
module Analytics
using DataFrames
using Statistics
using Dates
using StatsBase
export UserAnalytics, compute_metrics, plot_growth
# Analytics functions using DataFrames
struct UserAnalytics
df::DataFrame
end
function UserAnalytics(users::Vector)
df = DataFrame(
id = [u.id for u in users],
email = [u.email for u in users],
role = [u.role for u in users],
created_at = [u.created_at for u in users],
domain = [split(u.email, "@")[2] for u in users]
)
UserAnalytics(df)
end
function compute_metrics(analytics::UserAnalytics)
df = analytics.df
Dict(
:total_users => nrow(df),
:users_by_role => combine(groupby(df, :role), nrow => :count),
:users_by_domain => combine(
groupby(df, :domain),
nrow => :count
) |> x -> sort(x, :count, rev=true) |> x -> first(x, 10),
:growth_by_month => compute_growth(df)
)
end
function compute_growth(df::DataFrame)
df_copy = copy(df)
df_copy.month = Dates.floor.(df_copy.created_at, Month)
growth = combine(groupby(df_copy, :month), nrow => :new_users)
sort!(growth, :month)
growth.cumulative = cumsum(growth.new_users)
growth
end
# High-performance computation example
function compute_user_similarity(users::Vector{User}, metric::Symbol=:jaccard)
n = length(users)
similarity = zeros(Float64, n, n)
# Extract features (e.g., domain, role)
features = [Set([u.role, split(u.email, "@")[2]]) for u in users]
# Parallel computation
Threads.@threads for i in 1:n
for j in i:n
sim = compute_similarity(features[i], features[j], metric)
similarity[i, j] = sim
similarity[j, i] = sim
end
end
similarity
end
function compute_similarity(a::Set, b::Set, metric::Symbol)
if metric == :jaccard
length(a ∩ b) / length(a ∪ b)
elseif metric == :overlap
length(a ∩ b) / min(length(a), length(b))
else
error("Unknown metric: $metric")
end
end
end # module
```
```julia
module MachineLearning
using Flux
using Statistics
using Random
export UserClassifier, train!, predict
# Neural network for user role prediction
struct UserClassifier
model::Chain
feature_encoder::Function
end
function UserClassifier(input_dim::Int, hidden_dim::Int=64)
model = Chain(
Dense(input_dim, hidden_dim, relu),
Dropout(0.2),
Dense(hidden_dim, hidden_dim ÷ 2, relu),
Dense(hidden_dim ÷ 2, 3), # 3 roles
softmax
)
UserClassifier(model, default_encoder)
end
function default_encoder(user)
# Extract numerical features
Float32[
length(user.email),
count('@', user.email),
Dates.value(user.created_at) / 1e9,
# Add more features...
]
end
function train!(classifier::UserClassifier, users::Vector, labels::Vector;
epochs::Int=100, lr::Float64=0.01)
# Prepare data
X = hcat([classifier.feature_encoder(u) for u in users]...)
Y = Flux.onehotbatch(labels, [:admin, :member, :guest])
# Training loop
opt = Adam(lr)
ps = Flux.params(classifier.model)
losses = Float64[]
for epoch in 1:epochs
# Compute gradients
loss, grads = Flux.withgradient(ps) do
ŷ = classifier.model(X)
Flux.crossentropy(ŷ, Y)
end
# Update parameters
Flux.Optimise.update!(opt, ps, grads)
push!(losses, loss)
if epoch % 10 == 0
@info "Epoch $epoch: loss = $(round(loss, digits=4))"
end
end
losses
end
function predict(classifier::UserClassifier, user)
x = classifier.feature_encoder(user)
probs = classifier.model(x)
roles = [:admin, :member, :guest]
roles[argmax(probs)]
end
end # module
```
```julia
# Testing with Test stdlib
using Test
using .Users
@testset "User Module Tests" begin
@testset "User Creation" begin
user = User("test@example.com", "Test User")
@test user.email == "test@example.com"
@test user.role == member
@test !isempty(string(user.id))
end
@testset "Email Validation" begin
@test validate_email("valid@email.com")
@test !validate_email("invalid")
@test !validate_email("")
end
@testset "User Errors" begin
@test_throws UserError User("invalid", "Test")
@test_throws UserError User("test@test.com", "")
end
@testset "Repository" begin
repo = UserRepository()
user = User("test@example.com", "Test")
saved = save!(repo, user)
@test saved.id == user.id
found = find_by_id(repo, user.id)
@test !isnothing(found)
@test found.email == user.email
found_email = find_by_email(repo, "TEST@example.com")
@test !isnothing(found_email)
@test delete!(repo, user.id)
@test isnothing(find_by_id(repo, user.id))
end
end
```
## Best Practices
### Performance
- Use concrete types in containers
- Avoid global variables (or const them)
- Pre-allocate arrays
- Use @inbounds and @simd
- Profile with @time and @profile
### Type System
- Use abstract types for interfaces
- Parametric types for generic code
- Multiple dispatch over if-else chains
- Document type hierarchies
### Code Organization
- One module per file convention
- Use submodules for large packages
- Export only public API
- Include docstrings
### Testing
- Test edge cases
- Use @test_throws for errors
- Property-based testing with PropCheck.jl
- Benchmark critical paths
You write performant, type-stable Julia code leveraging multiple dispatch and the scientific computing ecosystem.