nix.dev icon indicating copy to clipboard operation
nix.dev copied to clipboard

Nix language tutorial

Open fricklerhandwerk opened this issue 3 years ago • 4 comments

survey results, my ongoing usability study, and anecdotal evidence show that effective onboarding requires a good Nix language tutorial.

closed by https://github.com/NixOS/nix.dev/pull/267

fricklerhandwerk avatar Jun 29 '22 09:06 fricklerhandwerk

@garbas says this is top priority from marketing perspective

fricklerhandwerk avatar Jul 06 '22 09:07 fricklerhandwerk

  • @fricklerhandwerk do you have a PR for your ongoing work on a Nix language tutorial @domenkozar?
    • @domenkozar no, just a bunch of notes
      • @fricklerhandwerk I could pick that up as the next action item
        • @domenkozar would be a good first thing to contribute to nix.dev
        • would test it with newbies
          • @infinisil do you have an ongoing stream of newcomers?
            • @fricklerhandwerk usually introduce friends as absolute Nix beginners
              • sometimes coworkers from Tweag (but most have some prior experience)
              • so far only one Summer of Nix applicant showed up, sent out offering to all of them
                • would be great to establish an official pipeline for user studies to get volunteers

fricklerhandwerk avatar Jul 07 '22 17:07 fricklerhandwerk

This issue has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/2022-07-07-documentation-team-meeting-notes-4/20198/1

nixos-discourse avatar Jul 07 '22 17:07 nixos-discourse

Here is an overview of prominent/relevant tutorials/overviews of the Nix language, including the Nix manual itself, and which language features (and peculiarities) they describe or mention.

Feature \ ResourceNix ManualNixOS Wiki: Overview of the Nix LanguageScrive Nix WorkshopNix by exampleA Tour of NixNix - A One PagerNix PillsNixOS Manual: Syntax Summary
Identifiershttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320561168
Value types overviewhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Typeshttps://github.com/tazjin/nix-1p#primitives--literals
Stringhttps://nixos.org/manual/nix/unstable/language/values.html#type-stringyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#stringshttps://nixos.wiki/wiki/Nix_by_examplehttps://nixcloud.io/tour/?id=4https://github.com/tazjin/nix-1p#primitives--literalshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320557968yes
Multi-line stringhttps://nixos.org/manual/nix/unstable/language/values.html#type-stringyeshttps://github.com/tazjin/nix-1p#primitives--literals
String interpolation Antiquotationhttps://nixos.org/manual/nix/unstable/language/values.html#type-stringyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#string-interpolationhttps://nixcloud.io/tour/?id=5https://github.com/tazjin/nix-1p#primitives--literalshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320557968yes
Escaping ruleshttps://nixos.org/manual/nix/unstable/language/values.html#type-stringhttps://nixos.wiki/wiki/Nix_by_example#Special_charactershttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320557968
URIhttps://nixos.org/manual/nix/unstable/language/values.html#type-stringyes
Integerhttps://nixos.org/manual/nix/unstable/language/values.html#type-numberyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#numbershttps://nixos.wiki/wiki/Nix_by_example#Primitive_types_and_operatorshttps://github.com/tazjin/nix-1p#primitives--literalsyes
Floating point numberhttps://nixos.org/manual/nix/unstable/language/values.html#type-numberyeshttps://github.com/tazjin/nix-1p#primitives--literals
Absolute pathhttps://nixos.org/manual/nix/unstable/language/values.html#type-pathhttps://nixos.wiki/wiki/Nix_by_example#Imports_and_paths
Relative pathhttps://nixos.org/manual/nix/unstable/language/values.html#type-pathyeshttps://scrive.github.io/nix-workshop/03-nix-basics/03-files.html#pathhttps://nixos.wiki/wiki/Nix_by_example#Imports_and_pathshttps://github.com/tazjin/nix-1p#primitives--literalsyes
Home pathhttps://nixos.org/manual/nix/unstable/language/values.html#type-path
<...> Search path Angle bracket syntaxhttps://nixos.org/manual/nix/unstable/command-ref/env-common.html?highlight=NIX_PATH#env-NIX_PATHyeshttps://github.com/tazjin/nix-1p#import--nix_path--entry
Booleanhttps://nixos.org/manual/nix/unstable/language/values.html#type-booleanyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#booleanshttps://nixos.wiki/wiki/Nix_by_example#Primitive_types_and_operatorsyes
Nullhttps://nixos.org/manual/nix/unstable/language/values.html#type-nullyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#null
Listhttps://nixos.org/manual/nix/unstable/language/values.html#listyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#listhttps://nixos.wiki/wiki/Nix_by_example#Listshttps://nixcloud.io/tour/?id=20https://github.com/tazjin/nix-1p#primitives--literalshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320525456yes
Attribute Sethttps://nixos.org/manual/nix/unstable/language/values.html#attribute-setyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#set--objecthttps://nixos.wiki/wiki/Nix_by_example#Composite_data-types_and_lazinesshttps://nixcloud.io/tour/?id=15 https://nixcloud.io/tour/?id=16 https://nixcloud.io/tour/?id=17https://github.com/tazjin/nix-1p#primitives--literalshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320522768yes
rechttps://nixos.org/manual/nix/unstable/language/constructs.html#recursive-setshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#rec_statementhttps://nixos.wiki/wiki/Nix_by_example#Lazy_loopiness_and_recursive_setshttps://nixcloud.io/tour/?id=14https://github.com/tazjin/nix-1p#primitives--literalshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320522768yes
Operators overviewhttps://nixos.org/manual/nix/unstable/language/operators.htmlhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Operatorshttps://nixos.wiki/wiki/Nix_by_example#Primitive_types_and_operatorshttps://github.com/tazjin/nix-1p#operatorshttps://nixos.org/manual/nixos/unstable/index.html#sec-nix-syntax-summary
Function call Function applicationyeshttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#functionhttps://nixos.wiki/wiki/Nix_by_example#Function_applicationhttps://nixcloud.io/tour/?id=6yes
. Attribute access Attribute selectionyesyes https://nixos.wiki/wiki/Overview_of_the_Nix_Language#Typeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#set--objecthttps://nixos.wiki/wiki/Nix_by_example#Composite_data-types_and_lazinesshttps://nixcloud.io/tour/?id=18 https://nixcloud.io/tour/?id=21yeshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320522768yes
Nested assignment .https://nixcloud.io/tour/?id=19 https://nixcloud.io/tour/?id=21yes
oryesyeshttps://github.com/tazjin/nix-1p#or-expressionsyes
// Update Mergeyesyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#merge-objectshttps://nixcloud.io/tour/?id=18yesyes
? Has attribute Testyesyeshttps://nixcloud.io/tour/?id=18yes
String concatenation +yeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#string-concatenationyeshttps://nixcloud.io/tour/?id=21yesyes
Integer addition +yesyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#numbersyes https://nixos.wiki/wiki/Nix_by_example#Typing_disciplinehttps://nixcloud.io/tour/?id=21yesyes
Path concatenation +https://scrive.github.io/nix-workshop/03-nix-basics/03-files.html#path-concatenation
List concatenation ++yesyeshttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#list-concatenationhttps://nixcloud.io/tour/?id=21yes
== Equalityyeshttps://nixcloud.io/tour/?id=19yes
!= Inequalityyeshttps://nixcloud.io/tour/?id=19yes
! Negation Boolean negationyeshttps://nixos.wiki/wiki/Nix_by_example#Boolean_operators_and_lazinesshttps://nixcloud.io/tour/?id=19yes
List operationshttps://nixos.wiki/wiki/Nix_by_example#Listshttps://nixcloud.io/tour/?id=20
if ... else ... then Conditional Conditional expression if expressionhttps://nixos.org/manual/nix/unstable/language/constructs.html#conditionalshttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#if-expressionhttps://nixos.wiki/wiki/Nix_by_example#Conditionalshttps://github.com/tazjin/nix-1p#if--then--else-https://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320515712yes
let ... in let expression let bindinghttps://nixos.org/manual/nix/unstable/language/constructs.html#let-expressionshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#let_..._in_statementhttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#let-expressionhttps://nixos.wiki/wiki/Nix_by_example#Let_expressions https://nixos.wiki/wiki/Nix_by_example#Modules.2C_public_and_privatehttps://nixcloud.io/tour/?id=3 https://nixcloud.io/tour/?id=23https://github.com/tazjin/nix-1p#variable-bindingshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320512656yes
with with expression with keyword https://nixos.org/manual/nix/unstable/language/constructs.html#with-expressionshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#with_statementhttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#with-expressionhttps://nixos.wiki/wiki/Nix_by_example#Dynamic_scopehttps://nixcloud.io/tour/?id=22https://github.com/tazjin/nix-1p#with-statementshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320502256yes
inherit inheritinghttps://nixos.org/manual/nix/unstable/language/constructs.html#inheriting-attributeshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#inherit_statementhttps://scrive.github.io/nix-workshop/03-nix-basics/01-primitives.html#inherithttps://nixcloud.io/tour/?id=22https://github.com/tazjin/nix-1p#inherit-keyword
asserthttps://nixos.org/manual/nix/unstable/language/constructs.html#assertionshttps://nixos.wiki/wiki/Nix_by_example#Assertionshttps://nixcloud.io/tour/?id=25yes
throwhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-throwhttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#lazy-evaluationhttps://nixos.wiki/wiki/Nix_by_example#Exceptions
tracehttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-tracehttps://nixos.wiki/wiki/Nix_by_example#Debugging
Commenthttps://nixos.org/manual/nix/unstable/language/constructs.html#comments
builtins overviewhttps://nixos.org/manual/nix/unstable/language/builtins.htmlhttps://github.com/tazjin/nix-1p#builtins
nixpkgs/lib overviewhttps://scrive.github.io/nix-workshop/03-nix-basics/04-import.html#importing-global-moduleshttps://github.com/tazjin/nix-1p#pkgslib
pkgs overviewhttps://github.com/tazjin/nix-1p#pkgs-itself
mentions pkgs.stdenv.mkDerivationhttps://scrive.github.io/nix-workshop/04-derivations/01-derivation-basics.html#standard-derivationhttps://github.com/tazjin/nix-1p#derivations
derivationhttps://nixos.org/manual/nix/unstable/language/derivations.htmlhttps://scrive.github.io/nix-workshop/04-derivations/04-raw-derivation.html#raw-derivationhttps://github.com/tazjin/nix-1p#derivationshttps://nixos.org/guides/nix-pills/our-first-derivation.html#idm140737320417648
importhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-importhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Importshttps://scrive.github.io/nix-workshop/03-nix-basics/04-import.html#importing-nix-moduleshttps://nixos.wiki/wiki/Nix_by_example#Imports_and_pathshttps://nixcloud.io/tour/?id=22https://github.com/tazjin/nix-1p#import--nix_path--entryhttps://nixos.org/guides/nix-pills/functions-and-imports.html#idm140737320444576yes
seqhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-seqhttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#sequencing
toFilehttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-toFilehttps://scrive.github.io/nix-workshop/03-nix-basics/03-files.html#string-to-file
readFilehttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-readFilehttps://scrive.github.io/nix-workshop/03-nix-basics/03-files.html#read-file
pathhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-pathhttps://scrive.github.io/nix-workshop/03-nix-basics/03-files.html#path-1
fetchurlhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-fetchurlhttps://scrive.github.io/nix-workshop/03-nix-basics/03-files.html#fetch-url
fetchTarballhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-fetchTarballhttps://scrive.github.io/nix-workshop/03-nix-basics/03-files.html#fetch-tarball
listToAttrshttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-listToAttrshttps://nixcloud.io/tour/?id=16
maphttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-maphttps://nixcloud.io/tour/?id=27yes
foldl'https://nixos.org/manual/nix/unstable/language/builtins.html#builtins-foldl'https://nixcloud.io/tour/?id=28
hasAttrhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-hasAttrhttps://nixos.wiki/wiki/Nix_by_example#Default_arguments
intersectAttrshttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-intersectAttrshttps://nixcloud.io/tour/?id=15
fromJSONhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-fromJSONhttps://nixcloud.io/tour/?id=16
tryEvalhttps://nixos.org/manual/nix/unstable/language/builtins.html#builtins-tryEvalhttps://nixos.wiki/wiki/Nix_by_example#Exceptions
Anonymous functions lambdahttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Functionshttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#functionhttps://nixos.wiki/wiki/Nix_by_example#Function_definitionhttps://github.com/tazjin/nix-1p#functionshttps://nixos.org/guides/nix-pills/functions-and-imports.html#idm140737320485600yes
Single argumenthttps://nixos.org/manual/nix/unstable/language/constructs.html#functionshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Functionshttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#functionhttps://nixcloud.io/tour/?id=6https://nixos.org/guides/nix-pills/functions-and-imports.html#idm140737320485600yes
Currying Multiple arguments (currying) Partial applicationhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Functionshttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#curried-functionhttps://nixos.wiki/wiki/Nix_by_example#Multi-parameter_functions_using_setshttps://nixcloud.io/tour/?id=12 https://nixcloud.io/tour/?id=13https://github.com/tazjin/nix-1p#multiple-arguments-curryinghttps://nixos.org/guides/nix-pills/functions-and-imports.html#idm140737320475200
Attribute argument Destructuring Named arguments Keyword arguments Multiple arguments (attribute sets) Arguments sethttps://nixos.org/manual/nix/unstable/language/constructs.html#functionshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Destructuringhttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#named-argumentshttps://nixos.wiki/wiki/Nix_by_example#Multi-parameter_functions_using_setshttps://nixcloud.io/tour/?id=7https://github.com/tazjin/nix-1p#multiple-arguments-attribute-setshttps://nixos.org/guides/nix-pills/functions-and-imports.html#idm140737320465200yes
Default attributes Default arguments Default valueshttps://nixos.org/manual/nix/unstable/language/constructs.html#functionshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Default_argumenthttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#default-argumentshttps://nixos.wiki/wiki/Nix_by_example#Default_argumentshttps://nixcloud.io/tour/?id=9https://github.com/tazjin/nix-1p#multiple-arguments-attribute-setshttps://nixos.org/guides/nix-pills/functions-and-imports.html#idm140737320457184yes
Ellipsis Additional attributes Optional attributes Variadic arguments Variadic attributeshttps://nixos.org/manual/nix/unstable/language/constructs.html#functionshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Accepting_unexpected_attributes_in_argument_sethttps://nixos.wiki/wiki/Nix_by_example#Multi-parameter_functions_using_setshttps://github.com/tazjin/nix-1p#multiple-arguments-attribute-setshttps://nixos.org/guides/nix-pills/functions-and-imports.html#idm140737320457184yes
@-pattern @ syntaxhttps://nixos.org/manual/nix/unstable/language/constructs.html#functionshttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Accepting_unexpected_attributes_in_argument_sethttps://nixcloud.io/tour/?id=10 https://nixcloud.io/tour/?id=11https://github.com/tazjin/nix-1p#multiple-arguments-attribute-setsyes
Lazyhttps://nixos.org/manual/nix/unstable/language/index.htmlhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Lazyhttps://scrive.github.io/nix-workshop/03-nix-basics/02-expressions.html#lazy-evaluationhttps://nixos.wiki/wiki/Nix_by_example#Boolean_operators_and_laziness https://nixos.wiki/wiki/Nix_by_example#Infinite_data_structureshttps://github.com/tazjin/nix-1p#overview
Purehttps://nixos.org/manual/nix/unstable/language/index.htmlhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Purehttps://nixos.wiki/wiki/Nix_by_example#Recursion https://nixos.wiki/wiki/Nix_by_example#Loops.3Fhttps://github.com/tazjin/nix-1p#overviewhttps://nixos.org/guides/nix-pills/basics-of-language.html#basics-of-language
Functionalhttps://nixos.org/manual/nix/unstable/language/index.htmlhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Functionalhttps://scrive.github.io/nix-workshop/01-getting-started/01-introduction.html#programming-languagehttps://github.com/tazjin/nix-1p#overview
Domain-specific Purpose-builthttps://nixos.org/manual/nix/unstable/language/index.htmlhttps://github.com/tazjin/nix-1p#overview
Dynamically typedhttps://scrive.github.io/nix-workshop/01-getting-started/01-introduction.html#programming-languagehttps://nixos.wiki/wiki/Nix_by_example#Typing_disciplinehttps://nixcloud.io/tour/?id=24
Expressions overviewhttps://nixos.wiki/wiki/Overview_of_the_Nix_Language#Expressionshttps://github.com/tazjin/nix-1p#overviewhttps://nixos.org/guides/nix-pills/basics-of-language.html#basics-of-language
Notes on errors or debugginghttps://nixos.wiki/wiki/Nix_by_example#Errorshttps://nixcloud.io/tour/?id=26
Notes on running exampleshttps://scrive.github.io/nix-workshop/02-nix-commands/03-nix--repl.htmlhttps://nixos.wiki/wiki/Nix_by_example#REPL https://nixos.wiki/wiki/Nix_by_example#Detour:_evaluating_fileshttps://nixos.org/guides/nix-pills/basics-of-language.html#idm140737320582656
Additional notes- function argument patterns do not have separate sections
- function application is never shown explicitly (only in large example)
- fairly good explanation of language features
- is incomplete (not counting references to nixpkgs)!
- expressions are sometimes incorrectly called statements- everything is a runnable example
- no comments, examples are probably to be used as lecture slides
- (attribute) sets are called objects
- update is called merge
- uses repl state indiscriminately
- result of import is called module
- some runnable examples- examples and exercises
- imports <nixpkgs> out of thin air for Lists exercise
- assignments are called variable bindings
- with is called a statement - nixpkgs manual is called Nix manual
- mentions some idioms from nixpkgs and calls them Nix idioms
- assignment is called variable definition
- language constructs are called control structures

fricklerhandwerk avatar Aug 09 '22 23:08 fricklerhandwerk

This issue has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/2023-05-15-documentation-team-meeting-notes-48/28221/1

nixos-discourse avatar May 16 '23 12:05 nixos-discourse