فا نیکسی

(ad-hoc)

Translation: رایج‌ترین روش برای استفاده از این کتابخانه، اجرای ورپرهای آنی (ad-hoc) به این صورت است:

Inline backticks line: `nix-shell -p 'sbcl.withPackages (ps: with ps; [ alexandria ])`

$ sbcl
* (load (sb-ext:posix-getenv "ASDF"))
* (asdf:load-system 'alexandria)

همچنین می‌توان یک محیط pkgs.mkShell در shell.nix/flake.nix ایجاد کرد:

let
  sbcl' = sbcl.withPackages (ps: [ ps.alexandria ]);
in
mkShell { packages = [ sbcl' ]; }

اکنون می‌توان از چنین Lispی برای مثال جهت کامپایل کردن کدهای منبع استفاده کرد:

{
  buildPhase = ''
    runHook preBuild

    ${sbcl'}/bin/sbcl --load my-build-file.lisp

    runHook postBuild
  '';
}

درون‌ریزی بسته‌ها از Quicklisp

برای صرفه‌جویی در نوشتن عبارت‌های Nix، اسکریپتی وجود دارد که تمام بسته‌های توزیع‌شده توسط Quicklisp را در imported.nix درون‌ریزی می‌کند. این کار با پارس کردن فایل‌های releases.txt و systems.txt آن انجام می‌شود که هر چند ماه یک‌بار در quicklisp.org منتشر می‌شوند.

فرآیند درون‌ریزی در پوشه import به صورت کد Common Lisp در سیستم ASDF با نام org.lispbuilds.nix پیاده‌سازی شده است. برای اجرای اسکریپت، می‌توان ql-import.lisp

cd pkgs/development/lisp-modules
nix-shell --run 'sbcl --script ql-import.lisp'

sbcl etc.) also export the buildASDFSystem function, which is similar to build-asdf-system from packages.nix, but is part of the public API.

Glossary check:

  • derivations -> درایویشن‌ها
  • function -> تابع

Translation:

تعریف دستی بسته‌ها در خارج از Nixpkgs

درایویشن‌های Lisp (مانند

آرگومان‌های زیر را می‌پذیرد:

  • pname: نام بسته
  • version: نسخه بسته
  • src: سورس بسته
  • patches: پچ‌هایی که باید پیش از
let
  alexandria = sbcl.buildASDFSystem rec {
    pname = "alexandria";
    version = "1.4";
    src = fetchFromGitLab {
      domain = "gitlab.common-lisp.net";
      owner = "alexandria";
      repo = "alexandria";
      tag = "v${version}";
      hash = "sha256-1Hzxt65dZvgOFIljjjlSGgKYkj+YBLwJCACi5DZsKmQ=";
    };
  };
  sbcl' = sbcl.withOverrides (self: super: { inherit alexandria; });
in
sbcl'.pkgs.alexandria

بازنشانی صفات بسته

بسته‌ها تابع overrideLispAttrs را ارائه می‌دهند که می‌توان از آن برای ساخت یک بسته جدید با پارامترهای متفاوت استفاده کرد.

مثالی از بازنشانی alexandria:

sbcl.pkgs.alexandria.overrideLispAttrs (oldAttrs: rec {
  version = "1.4";
  src = fetchFromGitLab {
    domain = "gitlab.common-lisp.net";
    owner = "alexandria";
    repo = "alexandria";
    tag = "v${version}";
    hash = "sha256-1Hzxt65dZvgOFIljjjlSGgKYkj+YBLwJCACi5DZsKmQ=";
  };
})

مدیریت سیستم‌های اسلش‌دار

سیستم‌های اسلش‌دار (ثانویه) نباید در

ecl.pkgs.alexandria.overrideLispAttrs (oldAttrs: {
  systems = oldAttrs.systems ++ [ "alexandria/tests" ];
  lispLibs = oldAttrs.lispLibs ++ [ ecl.pkgs.rt ];
})

برای اطلاع از نحوهٔ ادغام مجدد آن در ecl.pkgs، بخش مربوطه در مورد استفاده از

nix-shell -p 'sbcl.withPackages (ps: [ ps.alexandria ps.bordeaux-threads ])'

از چنین پوشاننده‌ای می‌توان به این صورت استفاده کرد:

$ sbcl
* (load (sb-ext:posix-getenv "ASDF"))
* (asdf:load-system 'alexandria)
* (asdf:load-system 'bordeaux-threads)

بارگیری ASDF

برای گرفتن بهترین نتیجه، هنگام استفاده از روکش‌های (wrappers) تولیدشده توسط کتابخانه، از فراخوانی (require 'asdf) خودداری کنید.

به جای آن،

wrapLisp {
  pkg = clisp;
  faslExt = "fas";
  flags = [
    "-E"
    "UTF8"
  ];
}