From 2c01d4daeff989a556083d26b7c6e5cf7f89b472 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sat, 5 Feb 2022 17:41:36 -0500 Subject: Prefix old post file names with dates. --- posts/first-guile-patch.md | 150 --------------------------------------------- 1 file changed, 150 deletions(-) delete mode 100644 posts/first-guile-patch.md (limited to 'posts/first-guile-patch.md') diff --git a/posts/first-guile-patch.md b/posts/first-guile-patch.md deleted file mode 100644 index d67c786..0000000 --- a/posts/first-guile-patch.md +++ /dev/null @@ -1,150 +0,0 @@ -title: First GNU Guile Patch and More Guix Packages -date: 2013-11-22 21:00 -tags: gnu, guix, scheme, guile, wsu -summary: I added alist->hash-table procedures for Guile’s native hash table implementation and packaged SDL libraries for Guix. ---- - -I have spent some of the last month working on contributing to GNU -Guile and now I can finally say that I have contributed code to the -project. Guile has several hash table implementations: a Guile native -one, SRFI-69, and R6RS. SRFI-69 contains a handy procedure, -`alist->hash-table`, which allows for a sort of hash literal-like -syntax: - -```scheme -(alist->hash-table - '((foo . 1) - (bar . 2) - (baz . 3))) -``` - -However, I prefer to use Guile’s native hash implementation, and -SRFI-69 is incompatible with it, so I decided to port -`alist->hash-table`. Unfortunately, it was not as simple as writing -just one procedure. The native hash tables actually have 4 different -ways of doing key comparisons: Using `equal?`, `eq?`, `eqv?`, and -user-defined procedures. This is a design flaw because the user must -make sure to use the right procedures at all times rather than simply -set the `hash` and `assoc` procedures when creating the hash table -instance. - -Below is the final implementation. Since 3 of the 4 variations were -essentially the same, I wrote a short macro to reduce code -duplication. - -```scheme -;;;; Copyright (C) 2013 Free Software Foundation, Inc. -;;;; -;;;; This library is free software; you can redistribute it and/or -;;;; modify it under the terms of the GNU Lesser General Public -;;;; License as published by the Free Software Foundation; either -;;;; version 3 of the License, or (at your option) any later version. -;;;; -;;;; This library is distributed in the hope that it will be useful, -;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;;;; Lesser General Public License for more details. -;;;; -;;;; You should have received a copy of the GNU Lesser General Public -;;;; License along with this library; if not, write to the Free Software -;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -;;;; - -(define-syntax-rule (define-alist-converter name hash-set-proc) - (define (name alist) - "Convert ALIST into a hash table." - (let ((table (make-hash-table))) - (for-each (lambda (pair) - (hash-set-proc table (car pair) (cdr pair))) - (reverse alist)) - table))) - -(define-alist-converter alist->hash-table hash-set!) -(define-alist-converter alist->hashq-table hashq-set!) -(define-alist-converter alist->hashv-table hashv-set!) - -(define (alist->hashx-table hash assoc alist) - "Convert ALIST into a hash table with custom HASH and ASSOC -procedures." - (let ((table (make-hash-table))) - (for-each (lambda (pair) - (hashx-set! hash assoc table (car pair) (cdr pair))) - (reverse alist)) - table)) -``` - -Not only did I manage to get my code into Guile, I was given commit -access to GNU Guix by the lead developer, Ludovic Courtès. I have -never had commit access to any free software project repositories -besides my own. I feel quite honored, as cheesy as that may sound. - -Packages for SDL and SDL2 have been merged into master, and packages -for SDL_gfx, SDL_image, SDL_mixer, SDL_net, and SDL_ttf for SDL 1.2 -are pending review. - -I like to show off the elegance of Guix package recipes, so here’s -some code: - -```scheme -;;; Copyright © 2013 David Thompson -;;; -;;; This file is part of GNU Guix. -;;; -;;; GNU Guix is free software; you can redistribute it and/or modify it -;;; under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 3 of the License, or (at -;;; your option) any later version. -;;; -;;; GNU Guix is distributed in the hope that it will be useful, but -;;; WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with GNU Guix. If not, see . - -(define sdl - (package - (name "sdl") - (version "1.2.15") - (source (origin - (method url-fetch) - (uri - (string-append "http://libsdl.org/release/SDL-" - version ".tar.gz")) - (sha256 - (base32 - "005d993xcac8236fpvd1iawkz4wqjybkpn8dbwaliqz5jfkidlyn")))) - (build-system gnu-build-system) - (arguments '(#:tests? #f)) ; no check target - (inputs `(("libx11" ,libx11) - ("libxrandr" ,libxrandr) - ("mesa" ,mesa) - ("alsa-lib" ,alsa-lib) - ("pkg-config" ,pkg-config) - ("pulseaudio" ,pulseaudio))) - (synopsis "Cross platform game development library") - (description "Simple DirectMedia Layer is a cross-platform development -library designed to provide low level access to audio, keyboard, mouse, -joystick, and graphics hardware.") - (home-page "http://libsdl.org/") - (license lgpl2.1))) - -(define sdl2 - (package (inherit sdl) - (name "sdl2") - (version "2.0.0") - (source (origin - (method url-fetch) - (uri - (string-append "http://libsdl.org/release/SDL2-" - version ".tar.gz")) - (sha256 - (base32 - "0y3in99brki7vc2mb4c0w39v70mf4h341mblhh8nmq4h7lawhskg")))) - (license bsd-3))) -``` - -Much help is needed to package the GNU system for Guix. If you are -interested in helping, please drop by `#guix` on freenode, we are -friendly. :) -- cgit v1.2.3