From 52bdc84582b499de50f4f4af2035d9eb9bc5ba61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christina=20S=C3=B8rensen?= Date: Fri, 7 Jul 2023 19:06:29 +0200 Subject: [PATCH] lambda-lisp: init at 2022-08-18 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds lambda lisp, and the lambda-lisp-blc backend. Signed-off-by: Christina Sørensen --- .../interpreters/lambda-lisp/default.nix | 82 +++++++++++++++++++ .../interpreters/lambda-lisp/sources.nix | 50 +++++++++++ pkgs/top-level/all-packages.nix | 3 + 3 files changed, 135 insertions(+) create mode 100644 pkgs/development/interpreters/lambda-lisp/default.nix create mode 100644 pkgs/development/interpreters/lambda-lisp/sources.nix diff --git a/pkgs/development/interpreters/lambda-lisp/default.nix b/pkgs/development/interpreters/lambda-lisp/default.nix new file mode 100644 index 000000000000..f2979e7aa679 --- /dev/null +++ b/pkgs/development/interpreters/lambda-lisp/default.nix @@ -0,0 +1,82 @@ +# Lambda Lisp has several backends, here we are using +# the blc one. Ideally, this should be made into several +# packages such as lambda-lisp-blc, lambda-lisp-lazyk, +# lambda-lisp-clamb, etc. + +{ lib +, gccStdenv +, fetchFromGitHub +, fetchurl +, runtimeShell +}: + +let + stdenv = gccStdenv; + s = import ./sources.nix { inherit fetchurl fetchFromGitHub; }; +in +stdenv.mkDerivation rec { + pname = "lambda-lisp-blc"; + version = s.lambdaLispVersion; + src = s.src; + flatSrc = s.flatSrc; + blcSrc = s.blcSrc; + + installPhase = '' + runHook preInstall + + mkdir -p ./build + cp $blcSrc ./build/Blc.S + cp $flatSrc ./build/flat.lds + cd build; + cat Blc.S | sed -e 's/#define.*TERMS.*//' > Blc.ext.S; + $CC -c -DTERMS=50000000 -o Blc.o Blc.ext.S + ld.bfd -o Blc Blc.o -T flat.lds + cd ..; + mv build/Blc ./bin + install -D -t $out/bin bin/Blc + install -D -t $out/lib bin/lambdalisp.blc + + cd build; + $CC ../tools/asc2bin.c -O2 -o asc2bin; + cd ..; + mv build/asc2bin ./bin; + chmod 755 ./bin/asc2bin; + install -D -t $out/bin bin/asc2bin + + echo -e "#!${runtimeShell}\n( cat $out/lib/lambdalisp.blc | $out/bin/asc2bin; cat ) | $out/bin/Blc" > lambda-lisp-blc + chmod +x lambda-lisp-blc + + install -D -t $out/bin lambda-lisp-blc + runHook postInstall + ''; + + doInstallCheck = true; + + installCheckPhase = '' + runHook preInstallCheck + + a=$(echo "(* (+ 1 2 3 4 5 6 7 8 9 10) 12020569 (- 2 5))" | $out/bin/lambda-lisp-blc | tr -d "> "); + test $a == -1983393885 + + runHook postInstallCheck + ''; + + meta = with lib; { + description = "A Lisp interpreter written in untyped lambda calculus"; + homepage = "https://github.com/woodrush/lambdalisp"; + longDescription = '' + LambdaLisp is a Lisp interpreter written as a closed untyped lambda calculus term. + It is written as a lambda calculus term LambdaLisp = λx. ... which takes a string + x as an input and returns a string as an output. The input x is the Lisp program + and the user's standard input, and the output is the standard output. Characters + are encoded into lambda term representations of natural numbers using the Church + encoding, and strings are encoded as a list of characters with lists expressed as + lambdas in the Mogensen-Scott encoding, so the entire computation process solely + consists of the beta-reduction of lambda terms, without introducing any + non-lambda-type object. + ''; + license = licenses.mit; + maintainers = with maintainers; [ cafkafk ]; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/development/interpreters/lambda-lisp/sources.nix b/pkgs/development/interpreters/lambda-lisp/sources.nix new file mode 100644 index 000000000000..8dbda01b4e27 --- /dev/null +++ b/pkgs/development/interpreters/lambda-lisp/sources.nix @@ -0,0 +1,50 @@ +let + lambdaLispVersion = "2022-08-18"; + blcVersion = "2"; + # Archive of "https://justine.lol/lambda/"; + justineLolArchive = "https://web.archive.org/web/20230614065521if_/https://justine.lol/lambda/"; +in +{ fetchFromGitHub, fetchurl }: { + inherit blcVersion; + inherit lambdaLispVersion; + + src = fetchFromGitHub { + owner = "woodrush"; + repo = "lambdalisp"; + rev = "2119cffed1ab2005f08ab3cfca92028270f08725"; + hash = "sha256-ml2xQ8s8sux+6GwTw8mID3PEOcH6hn8tyc/UI5tFaO0="; + }; + + uniCSrc = fetchFromGitHub { + owner = "tromp"; + repo = "tromp.github.io"; + rev = "b4de12e566c1fb0fa3f3babe89bac885f4c966a4"; + hash = "sha256-JmbqQp2kkkkkkkkSWQmG3uBxdgyIu4r2Ch8bBGyQ4H4="; + }; + + # needed later + clambSrc = fetchFromGitHub { + owner = "irori"; + repo = "clamb"; + rev = "44c1208697f394e22857195be5ea73bfdd48ebd1"; + hash = "sha256-1lGg2NBoxAKDCSnnPn19r/hwBC5paAKUnlcsUv3dpNY="; + }; + + # needed later + lazykSrc = fetchFromGitHub { + owner = "irori"; + repo = "lazyk"; + rev = "5edb0b834d0af5f7413c484eb3795d47ec2e3894"; + hash = "sha256-1lGg2NBoxAKDCSnnPn19r/hwBC5paAKUnlcsUv3dpNY="; + }; + + blcSrc = fetchurl { + url = "${justineLolArchive}Blc.S?v=${blcVersion}"; + hash = "sha256-qt7vDtn9WvDoBaLESCyyscA0u74914e8ZKhLiUAN52A="; + }; + + flatSrc = fetchurl { + url = "${justineLolArchive}flat.lds"; + hash = "sha256-HxX+10rV86zPv+UtF+n72obtz3DosWLMIab+uskxIjA="; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 9e840712e340..85bf1c33d8d2 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -17354,6 +17354,9 @@ with pkgs; konf = callPackage ../development/tools/konf { }; + lambda-lisp = callPackage ../development/interpreters/lambda-lisp { }; + lambda-lisp-blc = lambda-lisp; + lolcode = callPackage ../development/interpreters/lolcode { }; love_0_10 = callPackage ../development/interpreters/love/0.10.nix { };