{"id":13779017,"url":"https://github.com/chkoreff/Fexl","last_synced_at":"2025-05-11T12:32:35.872Z","repository":{"id":1511562,"uuid":"1768822","full_name":"chkoreff/Fexl","owner":"chkoreff","description":"Function EXpression Language (interpreter for functional programs)","archived":false,"fork":false,"pushed_at":"2024-11-08T12:26:35.000Z","size":2869,"stargazers_count":79,"open_issues_count":0,"forks_count":4,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-11-08T13:31:13.487Z","etag":null,"topics":["c","functional-programming","interpreter"],"latest_commit_sha":null,"homepage":"http://fexl.com","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chkoreff.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2011-05-18T23:23:33.000Z","updated_at":"2024-11-08T12:26:39.000Z","dependencies_parsed_at":"2023-07-09T10:16:39.539Z","dependency_job_id":"835aa34a-a60d-4c34-91df-c255659033e0","html_url":"https://github.com/chkoreff/Fexl","commit_stats":null,"previous_names":[],"tags_count":222,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkoreff%2FFexl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkoreff%2FFexl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkoreff%2FFexl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkoreff%2FFexl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chkoreff","download_url":"https://codeload.github.com/chkoreff/Fexl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225049019,"owners_count":17412911,"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":["c","functional-programming","interpreter"],"created_at":"2024-08-03T18:01:00.118Z","updated_at":"2025-05-11T12:32:35.842Z","avatar_url":"https://github.com/chkoreff.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"# fexl - Function EXpression Language\n\n[Fexl](http://fexl.com) is a simple but powerful scripting language.  It allows\nyou to manipulate numbers, strings, streams, and functions easily and reliably,\nall within a secure \"sandbox\".\n\n## Getting started\n\nGo into the source code directory:\n```\ncd src\n```\n\nBuild the code and test its validity:\n```\ntest/check\n```\n\nThat runs the test scripts, comparing their outputs with the reference files in\nthe out directory.  They should all succeed, however, if you run on a 32-bit\nsystem you will see some inconsequential differences in tests which measure\nmemory usage or deliberately try to run out of memory.\n\n## Installation\n\nThere is no \"installation\" as such.  You just put the Fexl code anywhere you\nlike, build it, and run it from there.  There is no script to copy it to /usr\nor anything like that.\n\nOne approach is to create a ~/bin/fexl script which does this:\n```\nexec ~/project/fexl/bin/fexl \"$@\"\n```\n\nSo the \"fexl\" script in my search path runs the real executable right where I\nbuilt it, setting argv[0] to its full path name, allowing it to resolve the\nnames of any files it might need that come bundled with the distribution.\n\n## Development Tools\n\nTo build the code:\n```\n./build\n```\n\nTo erase the output files and build the code from scratch:\n```\n./build clean\n```\n\nTo erase the output files:\n```\n./build erase\n```\n\nTo do a verbose build, showing all the commands:\n```\nverbose=1 ./build\n```\n\nTo build the code and run a fexl program:\n```\n./fexl [FILE]\n```\n\nTo build the code and check all the tests:\n```\ntest/check\n```\n\nYou can also check a specific set of tests, e.g.:\n```\ntest/check chars b10 sat crypto\n```\n\nYou can show the output of an individual test, e.g.:\n```\ntest/show sat\n```\n\nTo source the handy shell aliases that I use for development:\n```\n. handy\n```\n\nTo see the current version number (http://semver.org):\n```\ncat VERSION\n```\n\n## Test sort in GNU coreutils.\n\n```\n(cd test/ls_bug; ./try)\n```\n\n## Guide to source code\n\nThe `main` routine is in fexl.c.\n\nThe `eval` routine is in value.c.\n\nThe `value` structure is defined in value.h, and documented in value.c.\n\nThe memory.c file implements a disciplined approach to memory usage which\nverifies that there are no memory leaks during execution.  Also see `hold`\nand `drop` in value.c, which implement the reference counting mechanism.\n\nThe \"test\" directory contains the Fexl test suite.\n\n## Technical Details\n\nThe interpreter creates an initial value which represents your entire program.\nIt then evaluates that value, reducing it one step at a time until it reaches a\nfinal value.  Each step may possibly create side effects -- after all, the\nentire purpose of a computer program is to create side effects.  However, the\npurely functional aspect of Fexl allows you to isolate those side effects as\nfar as you like.\n\nA *value* is either an atom or a pair.  An *atom* represents either a built-in\nfunction (with a pointer to a C function), or a piece of data (e.g. long,\ndouble, string, file, etc.)  A *pair* represents the functional application of\na value on the left side to a value on the right side.\n\nThe initial value is fully resolved and contains no symbols, so the interpreter\ndoes not have to do any symbol lookups or bindings during evaluation.\n\n## Credits\n\n\"On the Building Blocks of Mathematical Logic\", Moses Schönfinkel, 1924\n\n\"The Calculi of Lambda-Conversion\", Alonzo Church, 1941\n\n\"Typed Representation of Objects by Functions\", Jørgen Steensgaard-Madsen, 1989\n\n## License\nThis code is copyright 2023 by Patrick Chkoreff (pc@fexl.com).\nSee the LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchkoreff%2FFexl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchkoreff%2FFexl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchkoreff%2FFexl/lists"}