{
  "code": null,
  "collection": "architecture",
  "href": "https://banes-lab.com/ontology#architecture-homoiconicity",
  "id": "homoiconicity",
  "kind": "quality-attribute",
  "layer": {
    "href": "https://banes-lab.com/ontology/schema#layer-declarative-core",
    "json": "https://banes-lab.com/json/records/layer/declarative-core",
    "label": "Declarative Core",
    "markdown": "https://banes-lab.com/records/layer/declarative-core.md",
    "ref": "layer:declarative-core"
  },
  "name": "Homoiconicity",
  "ref": "architecture:homoiconicity",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-code-as-data-representation",
          "json": "https://banes-lab.com/json/records/lexicon/code-as-data-representation",
          "label": "Code-as-Data Representation",
          "markdown": "https://banes-lab.com/records/lexicon/code-as-data-representation.md",
          "ref": "lexicon:code-as-data-representation"
        }
      ],
      "relation": "requires"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-metaprogramming",
          "json": "https://banes-lab.com/json/records/architecture/metaprogramming",
          "label": "Metaprogramming",
          "markdown": "https://banes-lab.com/records/architecture/metaprogramming.md",
          "ref": "architecture:metaprogramming"
        }
      ],
      "relation": "reinforces"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-macro-systems",
          "json": "https://banes-lab.com/json/records/lexicon/macro-systems",
          "label": "Macro Systems",
          "markdown": "https://banes-lab.com/records/lexicon/macro-systems.md",
          "ref": "lexicon:macro-systems"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-dsls",
          "json": "https://banes-lab.com/json/records/lexicon/dsls",
          "label": "DSLs",
          "markdown": "https://banes-lab.com/records/lexicon/dsls.md",
          "ref": "lexicon:dsls"
        }
      ],
      "relation": "enables"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-opaque-syntax-trees",
          "json": "https://banes-lab.com/json/records/lexicon/opaque-syntax-trees",
          "label": "Opaque Syntax Trees",
          "markdown": "https://banes-lab.com/records/lexicon/opaque-syntax-trees.md",
          "ref": "lexicon:opaque-syntax-trees"
        }
      ],
      "relation": "conflicts-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-readability",
          "json": "https://banes-lab.com/json/records/lexicon/readability",
          "label": "Readability",
          "markdown": "https://banes-lab.com/records/lexicon/readability.md",
          "ref": "lexicon:readability"
        }
      ],
      "relation": "tensions-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#tension-homoiconicity-readability",
          "json": "https://banes-lab.com/json/records/tension/homoiconicity-readability",
          "label": "Homoiconicity / Readability",
          "markdown": "https://banes-lab.com/records/tension/homoiconicity-readability.md",
          "ref": "tension:homoiconicity-readability"
        }
      ],
      "relation": "tensions"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-string-based-code-generation",
          "json": "https://banes-lab.com/json/records/lexicon/string-based-code-generation",
          "label": "String-Based Code Generation",
          "markdown": "https://banes-lab.com/records/lexicon/string-based-code-generation.md",
          "ref": "lexicon:string-based-code-generation"
        }
      ],
      "relation": "violated-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-syntax-tree-generation",
          "json": "https://banes-lab.com/json/records/lexicon/syntax-tree-generation",
          "label": "Syntax Tree Generation",
          "markdown": "https://banes-lab.com/records/lexicon/syntax-tree-generation.md",
          "ref": "lexicon:syntax-tree-generation"
        }
      ],
      "relation": "refactored-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#vocabulary-severity-contextual",
          "json": "https://banes-lab.com/json/records/vocabulary/severity-contextual",
          "label": "contextual",
          "markdown": "https://banes-lab.com/records/vocabulary/severity-contextual.md",
          "ref": "vocabulary:severity-contextual"
        }
      ],
      "relation": "severity"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-category-metaprogramming-language-oriented-architecture",
          "json": "https://banes-lab.com/json/records/architecture-category/metaprogramming-language-oriented-architecture",
          "label": "Metaprogramming / Language-Oriented Architecture",
          "markdown": "https://banes-lab.com/records/architecture-category/metaprogramming-language-oriented-architecture.md",
          "ref": "architecture-category:metaprogramming-language-oriented-architecture"
        }
      ],
      "relation": "category"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-code-as-data",
          "json": "https://banes-lab.com/json/records/architecture/code-as-data",
          "label": "Code as Data",
          "markdown": "https://banes-lab.com/records/architecture/code-as-data.md",
          "ref": "architecture:code-as-data"
        }
      ],
      "relation": "reinforced-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/software-architecture/principles#every-record-has-a-kind",
          "json": "https://banes-lab.com/json/software-architecture/principles/every-record-has-a-kind",
          "label": "Every record has a kind",
          "markdown": "https://banes-lab.com/software-architecture/principles/every-record-has-a-kind.md",
          "ref": "chapter:/software-architecture/principles#every-record-has-a-kind"
        },
        {
          "href": "https://banes-lab.com/software-architecture/principles#the-structural-domain",
          "json": "https://banes-lab.com/json/software-architecture/principles/the-structural-domain",
          "label": "The structural domain",
          "markdown": "https://banes-lab.com/software-architecture/principles/the-structural-domain.md",
          "ref": "chapter:/software-architecture/principles#the-structural-domain"
        },
        {
          "href": "https://banes-lab.com/software-architecture/glossary#the-principle-architecture",
          "json": "https://banes-lab.com/json/software-architecture/glossary/the-principle-architecture",
          "label": "The principle architecture",
          "markdown": "https://banes-lab.com/software-architecture/glossary/the-principle-architecture.md",
          "ref": "chapter:/software-architecture/glossary#the-principle-architecture"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-metaprogramming-language-oriented-architecture",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-metaprogramming-language-oriented-architecture",
          "label": "Metaprogramming / Language-Oriented Architecture",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-metaprogramming-language-oriented-architecture.md",
          "ref": "chapter:/ontology#architecture-category-metaprogramming-language-oriented-architecture"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-core-vocabulary",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-core-vocabulary",
          "label": "Core Vocabulary",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-core-vocabulary.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-core-vocabulary"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-metaprogramming-language-oriented-architecture",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-metaprogramming-language-oriented-architecture",
          "label": "Metaprogramming / Language-Oriented Architecture",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-metaprogramming-language-oriented-architecture.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-metaprogramming-language-oriented-architecture"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-quality-attributes",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-quality-attributes",
          "label": "Quality Attributes",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-quality-attributes.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-quality-attributes"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-vocabulary-severity",
          "json": "https://banes-lab.com/json/ontology/schema/the-vocabulary-severity",
          "label": "Severity levels",
          "markdown": "https://banes-lab.com/ontology/schema/the-vocabulary-severity.md",
          "ref": "chapter:/ontology/schema#the-vocabulary-severity"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-resolutions",
          "json": "https://banes-lab.com/json/ontology/schema/the-resolutions",
          "label": "The resolutions",
          "markdown": "https://banes-lab.com/ontology/schema/the-resolutions.md",
          "ref": "chapter:/ontology/schema#the-resolutions"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "summary": "The degree to which a language represents its programs in its own data structures, so programs can be inspected and transformed as data.",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/ontology#architecture-code-as-data",
      "json": "https://banes-lab.com/json/records/architecture/code-as-data",
      "label": "Code as Data",
      "markdown": "https://banes-lab.com/records/architecture/code-as-data.md",
      "ref": "architecture:code-as-data"
    },
    "previous": {
      "href": "https://banes-lab.com/ontology#architecture-manifest-based-design",
      "json": "https://banes-lab.com/json/records/architecture/manifest-based-design",
      "label": "Manifest-Based Design",
      "markdown": "https://banes-lab.com/records/architecture/manifest-based-design.md",
      "ref": "architecture:manifest-based-design"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/records/architecture",
    "label": "Architecture principles",
    "markdown": "https://banes-lab.com/api/records/architecture.md",
    "ref": "api:records/architecture"
  },
  "aliases": [],
  "exemplar": {
    "after": "type Expr =\n  | { op: \"value\"; key: keyof Foo }\n  | { op: \"const\"; value: number }\n  | { op: \"multiply\"; left: Expr; right: Expr };\nconst fooRule: Expr = { op: \"multiply\", left: { op: \"value\", key: \"value\" }, right: { op: \"const\", value: 2 } };\nconst result = evaluate(fooRule, foo);",
    "before": "function evaluateFoo(foo: Foo) { return foo.value * 2; }\nconst fooRule = { operation: \"multiply\", operand: 2 };",
    "lang": "ts",
    "medium": "code"
  },
  "formedBy": null,
  "scope": [
    "language",
    "metaprogramming"
  ],
  "severity": "contextual"
}
