# Code as Data

> A design rule that logic to be generated or transformed is held as a typed data structure, such as a syntax tree, that tools can inspect and rewrite.

Record: `architecture:code-as-data`
Kind: principle
Layer: [Declarative Core](https://banes-lab.com/records/layer/declarative-core.md)
Severity: contextual
Scope: language, compiler, runtime
Canonical: https://banes-lab.com/ontology#architecture-code-as-data

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [Homoiconicity](https://banes-lab.com/records/architecture/homoiconicity.md) and before [Metaprogramming](https://banes-lab.com/records/architecture/metaprogramming.md).

## Repair

- Refactored by: Use AST Builder, Typed DSL
- Detected by: dynamic eval/string code construction
- Violated by: unsafe string eval/generation
- Measured by: unsafe eval count
- Enforced by: banned API rules

## Requires

- [AST or Data Representation](https://banes-lab.com/records/lexicon/ast-or-data-representation.md)

## Reinforces

- [Homoiconicity](https://banes-lab.com/records/architecture/homoiconicity.md)
- [Code Generation](https://banes-lab.com/records/lexicon/code-generation.md)

## Enables

- [Program Transformation](https://banes-lab.com/records/lexicon/program-transformation.md)

## Conflicts with

- [String-Based Code Generation](https://banes-lab.com/records/lexicon/string-based-code-generation.md)

## In tension with

- [Safety/Debuggability](https://banes-lab.com/records/lexicon/safety-debuggability.md)

## Tensions

- [Code as Data / Safety/Debuggability](https://banes-lab.com/records/tension/code-as-data-safety-debuggability.md)

## Severity

- [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)

## Category

- [Metaprogramming / Language-Oriented Architecture](https://banes-lab.com/records/architecture-category/metaprogramming-language-oriented-architecture.md)

## Linked from

- [Definitions own what, code owns how](https://banes-lab.com/software-architecture/model/definitions-own-what.md)
- [The structural domain](https://banes-lab.com/software-architecture/principles/the-structural-domain.md)
- [Metaprogramming / Language-Oriented Architecture](https://banes-lab.com/ontology/principles/architecture-category-metaprogramming-language-oriented-architecture.md)
- [Core Vocabulary](https://banes-lab.com/ontology/lexicon/lexicon-category-core-vocabulary.md)
- [Metaprogramming / Language-Oriented Architecture](https://banes-lab.com/ontology/lexicon/lexicon-category-metaprogramming-language-oriented-architecture.md)
- [Severity levels](https://banes-lab.com/ontology/schema/the-vocabulary-severity.md)
- [The resolutions](https://banes-lab.com/ontology/schema/the-resolutions.md)
