{"id":13418032,"url":"https://github.com/tomhrr/dale","last_synced_at":"2025-03-15T02:32:27.811Z","repository":{"id":8628165,"uuid":"10273216","full_name":"tomhrr/dale","owner":"tomhrr","description":"Lisp-flavoured C","archived":false,"fork":false,"pushed_at":"2023-05-14T10:40:25.000Z","size":3856,"stargazers_count":1010,"open_issues_count":26,"forks_count":92,"subscribers_count":23,"default_branch":"master","last_synced_at":"2024-01-25T18:07:30.507Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomhrr.png","metadata":{"files":{"readme":"README.md","changelog":"Changes","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2013-05-24T19:11:01.000Z","updated_at":"2024-01-24T09:27:58.000Z","dependencies_parsed_at":"2023-02-15T16:16:19.226Z","dependency_job_id":"2646275a-d852-4eea-8e4b-3365a4d20027","html_url":"https://github.com/tomhrr/dale","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomhrr%2Fdale","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomhrr%2Fdale/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomhrr%2Fdale/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomhrr%2Fdale/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomhrr","download_url":"https://codeload.github.com/tomhrr/dale/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221532188,"owners_count":16838913,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T22:00:57.529Z","updated_at":"2025-03-15T02:32:27.805Z","avatar_url":"https://github.com/tomhrr.png","language":"C++","funding_links":[],"categories":["TODO scan for Android support in followings","Uncategorized","Languages","C++","Compilers and Interpreters"],"sub_categories":["Uncategorized","C/C++","Educational and Toy Projects"],"readme":"## Dale\n\n[![Build Status](https://github.com/tomhrr/dale/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/tomhrr/dale/actions)\n\nDale is a system (no GC) programming language that uses S-expressions\nfor syntax and supports syntactic macros. The basic language is\nsimilar to C, with the following additional features:\n\n  * local type deduction;\n  * overloaded functions;\n  * anonymous functions;\n  * reference parameters;\n  * initialisers and destructors;\n  * variants;\n  * namespaces;\n  * modules;\n  * concepts; and\n  * compiler introspection.\n\nIt should be usable on most Linux/macOS/BSD systems where LLVM is\nable to be built.  It has been tested on x86-64 (all), ARM64\n(Linux, macOS) and ppc64le (Linux).\n\n### Documentation\n\n[Index](./doc/index.md)  \n[As single page](./doc/all.md)\n\n### Install\n\n#### Dependencies\n\n  * LLVM (3.2-14.0)\n  * libffi\n\n#### Out-of-tree (recommended)\n\n    mkdir ../build\n    cd ../build\n    cmake ../dale\n    make\n    make tests\n    make install\n\n#### In-tree\n\n    cmake .\n    make\n    make tests\n    make install\n\n#### Common build problems\n\nSee [Common build problems](./doc/1-2-setup.md#common-build-problems).\n\n#### Container (evaluation)\n\nThe container runs the REPL by default, but includes bash\n(`/bin/bash`) for more general testing/evaluation.\n\n    docker run -it tomhrr/dale\n\n### Examples\n\n**hello-world**\n\n```clojure\n(import cstdio)\n\n(def main (fn extern-c int (void)\n  (printf \"hello, world\\n\")))\n```\n```\n\u003e hello, world\n```\n\n**hello-name**\n\n```clojure\n(import cstdio)\n\n(def main (fn extern-c int (void)\n  (def name (var auto (p (const char)) \"name\"))\n  (printf \"hello, %s\\n\" name)))\n```\n```\n\u003e hello, name\n```\n\n**type-deduction**\n\n```clojure\n(import cstdio)\n(import stdlib)\n\n(def main (fn extern-c int (void)\n  (let ((a \\ 1)\n        (b \\ 2))\n    (printf \"%d\\n\" (+ a b)))))\n```\n```\n\u003e 3\n```\n\n**overloading**\n\n```clojure\n(import cstdio)\n(import cstdlib)\n\n(def Point (struct intern ((x int) (y int))))\n\n(def + (fn intern Point ((a Point) (b Point))\n  (let ((r Point ((x (+ (@: a x) (@: b x)))\n                  (y (+ (@: a y) (@: b y))))))\n    (return r))))\n\n(def main (fn extern-c int (void)\n  (let ((a Point ((x 1) (y 2)))\n        (b Point ((x 3) (y 4)))\n        (c Point (+ a b)))\n    (printf \"%d %d\\n\" (@: c x) (@: c y)))))\n```\n```\n\u003e 4 6\n```\n\n**anonymous-functions**\n\n```clojure\n(import cstdio)\n(import stdlib)\n\n(def main (fn extern-c int (void)\n  (let ((anon-fn \\ (fn int ((n int)) (* 2 n))))\n    (printf \"%d\\n\" (anon-fn 5)))))\n```\n```\n\u003e 10\n```\n\n**macros**\n\n```clojure\n(import cstdio)\n(import stdlib)\n(import macros)\n\n(using-namespace std.macros\n  (def unless (macro intern (condition statement)\n    (qq do\n      (and (not (uq condition))\n           (do (uq statement) true)))))\n\n  (def main (fn extern-c int (void)\n    (unless (= 1 2)\n      (printf \"1 does not equal 2\\n\"))\n    (return 0))))\n```\n```\n\u003e 1 does not equal 2\n```\n\n**typed-macros**\n\n```clojure\n(import cstdio)\n(import macros)\n\n(using-namespace std.macros\n  (def + (macro intern ((a int) (b int) (c int))\n    (qq do (+ (uq a) (+ (uq b) (uq c))))))\n\n  (def main (fn extern-c int (void)\n    (printf \"%d\\n\" (+ 1 2 3)))))\n```\n```\n\u003e 6\n```\n\n**introspection**\n\n```clojure\n(import introspection)\n(import stdlib)\n\n(def Point (struct intern ((x int) (y int))))\n\n(using-namespace std.macros\n  (def show-struct-details (macro intern (st)\n     (let ((name  \\ (@:@ st token-str))\n           (count \\ (struct-member-count mc st)))\n       (printf \"Struct: %s\\n\"       name)\n       (printf \"Member count: %d\\n\" count)\n       (let ((i \\ 0))\n         (for true (\u003c i count) (incv i)\n           (printf \"Member %d: %s\\n\" (+ i 1) (struct-member-name mc st i))))\n       (nullptr DNode))))\n\n  (def main (fn extern-c int (void)\n    (show-struct-details Point)\n    0)))\n```\n```\n\u003e Struct: Point\n\u003e Member count: 2\n\u003e Member 1: x\n\u003e Member 2: y\n```\n\n**error-reporting**\n\n```clojure\n(import introspection)\n(import stdlib)\n\n(using-namespace std.macros\n  (def assert-is-struct (macro intern (st)\n    (let ((count \\ (struct-member-count mc st)))\n      (and (= -1 count)\n           (do (report-error mc st \"struct type does not exist\")\n               true))\n      (return (nullptr DNode)))))\n\n  (def main (fn extern-c int (void)\n    (assert-is-struct Point)\n    0)))\n```\n```\n\u003e ./error-reporting.dt:13:23: error: struct type does not exist (see macro at 13:5)\n\u003e ./error-reporting.dt:13:5: error: macro expansion error (see previous)\n```\n\n**derivations**\n\n```clojure\n(import derivations)\n\n(def Point (struct intern ((x int) (y int))))\n\n(std.concepts.implement Struct Point)\n(std.concepts.instantiate relations Point)\n\n(def main (fn extern-c int (void)\n  (let ((p1 Point ((x 1) (y 2)))\n        (p2 Point ((x 3) (y 4))))\n    (and (!= p1 p2)\n         (do (printf \"p1 and p2 are not equal\\n\") true))\n    (and (\u003c= p1 p2)\n         (do (printf \"p1 is less than or equal to p2\\n\") true))\n    (and (\u003e p2 p1)\n         (do (printf \"p2 is more than p1\\n\") true))\n    0)))\n```\n```\n\u003e p1 and p2 are not equal\n\u003e p1 is less than or equal to p2\n\u003e p2 is more than p1\n```\n\n**containers**\n\n```clojure\n(import vector)\n(import array)\n(import algorithms)\n(import cstdio)\n\n(using-namespace std.concepts\n  (instantiate Vector int)\n  (instantiate Array int 10)\n  (instantiate copy (Iterator (Vector int))\n                    (Iterator (Array int 10))))\n\n(def main (fn extern-c int (void)\n  (let ((vec (Vector int))\n        (arr (Array int 10))\n        (i int))\n    (for (setv i 0) (\u003c i 10) (incv i)\n      (push-back vec i))\n    (copy (begin vec) (end vec) (begin arr))\n    (let ((b \\ (begin arr))\n          (e \\ (end arr)))\n      (for true (!= b e) (setv b (successor b))\n        (printf \"%d \" (@ (source b)))))\n    (printf \"\\n\")\n    0)))\n```\n```\n\u003e 0 1 2 3 4 5 6 7 8 9 \n```\n\n**variants**\n\n```clojure\n(import variant)\n(import cstdio)\n\n(def-variant Number ((Int    ((a int)))\n                     (Float  ((a float)))))\n\n(def main (fn extern-c int (void)\n  (let ((ni Number (Int 1))\n        (nf Number (Float 2.0))\n        (na (array-of 2 Number) (array ni nf)))\n    (for (i \\ 0) (\u003c i 2) (incv i)\n      (let ((nc Number (@$ na i)))\n        (case nc\n          (Int    (printf \"Number is int (%d)\\n\"    (@:@ nc a)))\n          (Float  (printf \"Number is float (%f)\\n\"  (@:@ nc a)))))))\n  0))\n\n```\n```\n\u003e Number is int (1)\n\u003e Number is float (2.000000)\n```\n\n### Bugs/problems/suggestions\n\nPlease report to the [GitHub issue tracker](https://github.com/tomhrr/dale/issues).\n\n### Discussion\n\nThe mailing list address is\n[dale-lang@googlegroups.com](mailto:dale-lang@googlegroups.com).  See\nalso\n[https://groups.google.com/forum/#!forum/dale-lang](https://groups.google.com/forum/#!forum/dale-lang).\n\n### Licence\n\nSee LICENCE.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomhrr%2Fdale","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomhrr%2Fdale","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomhrr%2Fdale/lists"}