macos-programmer
macOS-specific development patterns, platform APIs, and decision frameworks. Use when developing Mac apps, macOS applications,…
Functional programming principles, patterns, and practices. Use when working with functional languages (Racket, Clojure, Erlang, Haskell, Idris, Scheme, OCaml, F#, Elixir, etc.) without language-specific skills available, or when applying functional paradigms in multi-paradigm
Claude Code
$ npx -y skills add Pyroxin/opinionated-claude-skills --skill functional-programmer --agent claude-code
Codex
$ npx skills add Pyroxin/opinionated-claude-skills --skill functional-programmer -a codex -y
Cursor
$ npx skills add Pyroxin/opinionated-claude-skills --skill functional-programmer -a cursor -y
Gemini CLI
$ npx skills add Pyroxin/opinionated-claude-skills --skill functional-programmer -a gemini-cli -y
GitHub Copilot
$ npx skills add Pyroxin/opinionated-claude-skills --skill functional-programmer -a github-copilot -y
OpenCode
$ npx skills add Pyroxin/opinionated-claude-skills --skill functional-programmer -a opencode -y
Windsurf
$ npx skills add Pyroxin/opinionated-claude-skills --skill functional-programmer -a windsurf -y
name: functional-programmer description: Functional programming principles, patterns, and practices. Use when working with functional languages (Racket, Clojure, Erlang, Haskell, Idris, Scheme, OCaml, F#, Elixir, etc.) without language-specific skills available, or when applying functional paradigms in multi-paradigm languages.
This skill provides guidance on functional programming principles, patterns, and practices. Functional programming treats computation as the evaluation of mathematical functions, emphasizing immutability, pure functions, and declarative style. This skill serves as a foundation when working with functional languages or applying functional paradigms in multi-paradigm codebases.
Use this skill when:
**Note:** Language-specific skills (e.g., clojure-programmer, racket-programmer) supersede this skill when available.
Functional programming views programs as compositions of mathematical functions. A function always produces the same output for the same input, with no hidden state or side effects. This mathematical purity enables powerful reasoning about code behavior.
**Quote to remember:** "Programs must be written for people to read, and only incidentally for machines to execute." — Harold Abelson, SICP
Rather than modifying data in place, functional programming creates new data structures through transformation. This immutability enables:
Build complex behavior by composing simple functions. Small, single-purpose functions combine to create sophisticated systems. Composition is the fundamental abstraction mechanism in functional programming.
Data structures cannot be modified after creation. Instead, transformations produce new structures. This makes time and change explicit rather than hidden.
**Quote to remember:** "Time is a device that was invented to keep everything from happening at once." — Ray Cummings (1922), often misattributed
**Why immutability matters:**
**Implementation:** Persistent data structures with structural sharing, copy-on-write, or immutable-by-convention.
Pure functions always return the same output for the same input, with no side effects. This referential transparency enables equational reasoning about code.
**Why purity matters:**
**Managing effects:** Push side effects to program boundaries. Separate pure core logic from effectful actions. Use effect systems when appropriate.
Functions as values enable abstracting over patterns, not just data. This is more powerful than data abstraction alone.
**Why higher-order functions matter:**
Express *what* to compute, not *how*. Describe desired results rather than step-by-step procedures. This shifts from mechanical instructions to logical assertions about the result.
**Why declarative style matters:**
<fp_decision_framework>
From the software-engineer skill, use functional approaches when:
**Key principles:**
<paradigm_decision_table>
| Situation | FP Strength | Consider Alternative When | |-----------|-------------|---------------------------| | Data pipelines | Composition, immutability | Complex branching logic needed | | Concurrent systems | No shared mutable state | Inherently stateful (games, GUIs) | | Correctness-critical | Equational reasoning, testing | Performance-critical tight loops | | Reusable operations | Higher-order functions | Team unfamiliar with FP | | Domain modeling | ADTs, pattern matching | Extensible data (expression problem) | | Parsing/transformation | Declarative specification | Complex imperative protocols | | Mathematical computation | Pure functions match math | I/O-heavy applications | </paradigm_decision_table> </fp_decision_framework>
<fp_thinking_patterns>
<data_transformation>
Prefer expressing operation
This project descends from the personal prompts I'd been keeping for Claude Code prior to the release of skills and plugins. Over time it's also evolved into a sandbox where I figure out what makes Claude reliably good at a task, and find prompts that work.
macOS-specific development patterns, platform APIs, and decision frameworks. Use when developing Mac apps, macOS applications,…
Swift-specific idioms, tooling, and philosophy for both application development and command-line scripting. Use when working with…
Fish shell scripting judgment frameworks and critical idioms. Use when writing Fish scripts or shell automation. Focuses on when…
Java-specific tooling, documentation standards, testing practices, and modern idioms. Use when working with Java code or…
Clojure-specific philosophy, idioms, and judgment frameworks. Use when working with Clojure code. Emphasizes data-oriented…
Racket-specific tooling, libraries, idioms, and language-oriented programming philosophy. Use when working with Racket code.…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.