Hi people
Today I wrote this draft blog post while playing around:
Playing with Guix REPL from scratch
This is a small example of how to quickly get an environment to play
with Guix in guile.
First setup your environment.
I choose a x86_64 PC and booted up the installer from an usb stick.
This is a nice environment because it already is running GuixSD in a
console and you have are in Guix land with 8500 packages at your
fingertips.
I started by installing a sensible array of packages:
$ guix package -i emacs-no-x lynx git-minimal guile-readline
guile-colorized emacs-paredit nss-certs
To set this up as intended then run:
$ export
GUILE_LOAD_PATH=$HOME/.guix-profile/share/guile/site/2.2:/run/current-system/profile/share/guile/site/2.2
$ export SSL_CERT_DIR=/root/.guix-profile/etc/ssl/certs
Now fire up the guix repl with
$guix repl
Load e.g. this to start hacking on package records:
(use-modules
(guix packages)
(guix import utils)
(gnu)
(gnu packages sync))
Now you can start hacking on all packages in sync.scm using Scheme
procedures from (gnu packages) (see the source of this module for
details or guess and press tab)
E.g. (package<TAB><TAB> shows this list of nice procedures availiable:
package
package->cross-derivation
package->definition
package->derivation
package-build-system
package-cross-build-system-error?
package-cross-derivation
package-derivation
package-description
package-direct-inputs
package-direct-sources
package-error-invalid-input
package-error-package
package-error?
package-field-location
package-file
package-full-name
package-grafts
package-home-page
package-input-error?
package-input-rewriting
package-inputs
package-license
package-location
package-maintainers
package-mapping
package-name
package-native-inputs
package-native-search-paths
package-output
package-outputs
package-patched-vulnerabilities
package-propagated-inputs
package-properties
package-search-paths
package-source
package-source-derivation
package-superseded
package-supported-systems
package-synopsis
package-transitive-inputs
package-transitive-native-inputs
package-transitive-native-search-paths
package-transitive-propagated-inputs
package-transitive-sources
package-transitive-supported-systems
package-transitive-target-inputs
package-upstream-name
package-version
package/inherit
package?
In addition to this there are the following origin-record-procedures:
E.g. (origin<TAB><TAB> shows this list
origin
origin->derivation
origin-actual-file-name
origin-file-name
origin-method
origin-modules
origin-patch-flags
origin-patch-guile
origin-patch-inputs
origin-patches
origin-sha256
origin-snippet
origin-uri
origin?
What can we do with this you might ask?
Well how about getting the url of a specific package?
scheme@(guix-user)> (origin-uri (package-source lsyncd))
$4 = "https://github.com/axkibe/lsyncd/archive/release-2.2.2.tar.gz"
Fetching it?
scheme@(guix-user)> (url-fetch
(origin-uri (package-source lsyncd)) "temp")
Starting download of temp
From https://github.com/axkibe/lsyncd/archive/release-2.2.2.tar.gz...
following redirection to
`https://codeload.github.com/axkibe/lsyncd/tar.gz/release-2.2.2'...
release-2.2.2.tar.gz 253KiB/s 00:00 | 80KiB
transferred
$3 = "temp"
With fold-packages you can walk through the whole stack of package
records if you would like and count say the number of packages with
the prefix "python-":
scheme@(guile-user)> (define snakes
(fold-packages
(lambda (package lst)
(if (string-prefix? "python"
(package-name package))
(cons package lst)
lst))
'()))
Now we can work on this list. As of writing this we have this many
items in the list:
scheme@(guix-user)> (length snakes)
$5 = 1532
scheme@(guile-user)> (define snakes
(fold-packages
(lambda (package lst)
(if (string-prefix? "python"
(package-name package))
(cons (origin-url package) lst)
lst))
'()))
If you create something worth saving, mount an USB stick or a harddisk
partition and save it there.