1 | ((title . "Issue 21") |
---|
2 | (authors "Andy Bennett") |
---|
3 | (date . 1321465864)) |
---|
4 | |
---|
5 | == 0. Introduction |
---|
6 | |
---|
7 | Welcome to the 21st issue of the Chicken Gazette. While the gazette |
---|
8 | was on hiatus the chicken community was definitely not. |
---|
9 | |
---|
10 | With the stabilisation of Chicken 4.7 well underway since the last |
---|
11 | gazette... |
---|
12 | |
---|
13 | Some people have also started to set up salmonella farms and C-Keen |
---|
14 | has completed his "Chicken Zoo". |
---|
15 | |
---|
16 | Enjoy! |
---|
17 | |
---|
18 | |
---|
19 | == 1. Chickens Out & About |
---|
20 | |
---|
21 | === Nuremberg (December 2011) |
---|
22 | [[http://wiki.call-cc.org/users/christian-kellermann|Christian Kellermann]] wrote |
---|
23 | ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00114.html|2011/10/22 17:38Z]]) to |
---|
24 | confirm the planned Chicken Hacking Sprint scheduled for the beginning of December. |
---|
25 | |
---|
26 | Interested and available Chickenauts will meet in Nuremberg on the weekend of 9th, 10th and 11th |
---|
27 | of December. If you haven't done so already, you can let us know that you will be joining us by |
---|
28 | placing a note at the foot of the [[https://wiki.call-cc.org/chicken-sprint-nuremberg|wiki page]]. |
---|
29 | If you can't attend in person then we'll be keeping an eye on IRC so feel free to book yourself |
---|
30 | a slot in your cave at home and join us throughout the weekend and into the evenings, Central European Time. |
---|
31 | |
---|
32 | For those of you keeping score, this will bring the total number of Chicken meets this year to |
---|
33 | 5 (FOSDEM, Cologne, FrOSCon, T-DOSE and Nuremberg). |
---|
34 | |
---|
35 | |
---|
36 | === Cologne (March 2011) |
---|
37 | |
---|
38 | In March, Chickens met up at the Chaos Computer Club in Cologne, Germany for a Chicken Hacking Weekend. Here's |
---|
39 | [[http://wiki.call-cc.org/users/moritz-heidkamp|Moritz Heidkamp]]'s report on what they got up to. |
---|
40 | |
---|
41 | The usual suspects [[user:peter-bex|Peter Bex]], |
---|
42 | [[user:felix-winkelmann|Felix Winkelmann]], |
---|
43 | [[user:christian-kellermann|Christian Kellermann]] and me met for two |
---|
44 | and a half days of exchanging ideas and hacking. While we also fixed a |
---|
45 | good share of bugs our main goal for this weekend was to create a |
---|
46 | working prototype of a distributed egg system. By the end of Sunday, |
---|
47 | mostly thanks to Peter's effort, we had something that was already |
---|
48 | pretty similar to what is in use today (see |
---|
49 | [[http://lists.nongnu.org/archive/html/chicken-users/2011-03/msg00160.html|his announcement on the mailing list]]). Apart |
---|
50 | from that some interested visitors stopped by every now and then. Some |
---|
51 | nice chats, food and the occasional beers were had which hopefully |
---|
52 | helped to spread the Chicken word. |
---|
53 | |
---|
54 | |
---|
55 | === FrOSCon (August 2011) |
---|
56 | At FrOSCon in August we sported not only a project booth but a presentation room as well so we took the |
---|
57 | opportunity to lay on a couple of talks for the delegates. |
---|
58 | |
---|
59 | [[http://wiki.call-cc.org/users/moritz-heidkamp|Moritz Heidkamp]] presented |
---|
60 | "[[http://programm.froscon.org/2011/events/869.html|An introduction to Lisp]]: |
---|
61 | Why to talk to computers in parentheses" whilst |
---|
62 | [[http://wiki.call-cc.org/users/christian-kellermann|Christian Kellermann]] offered |
---|
63 | "[[http://programm.froscon.org/2011/events/867.html|A guided tour through the republic of CHICKEN]]: |
---|
64 | get up to speed with the practical scheme implementation". |
---|
65 | [[http://wiki.call-cc.org/users/christian-kellermann|Christian]] has been keeping his talk up-to-date and |
---|
66 | you can find the latest version [[http://wiki.call-cc.org/chickenista-guide|on the wiki]]. |
---|
67 | |
---|
68 | Naturally, there are [[http://www.call-cc.org/pictures/froscon2011/|pictures]]. |
---|
69 | |
---|
70 | |
---|
71 | === T-DOSE 2011 (November 2011) |
---|
72 | European Chickens met up at T-DOSE in Eindhoven, The Netherlands on the weekend of the 5th, 6th and 7th of |
---|
73 | November. [[http://wiki.call-cc.org/users/peter-bex|Peter Bex]] arranged for us to contribute a "Chicken |
---|
74 | Scheme Project Booth" and we subsequently lured a few Dutch hackers into #chicken on IRC. |
---|
75 | |
---|
76 | [[http://wiki.call-cc.org/users/christian-kellermann|Christian Kellermann]] knocked up some impressive demos |
---|
77 | of [[http://en.wikipedia.org/wiki/Pong|PONG]] using Chicken's [[http://wiki.call-cc.org/eggref/4/cairo|Cairo Egg]]. |
---|
78 | |
---|
79 | [[http://wiki.call-cc.org/users/alaric-blagrave-snellpym|Alaric Snell-Pym]] finished off the tests for his |
---|
80 | [[http://wiki.call-cc.org/eggref/4/ugarit|Ugarit]] backup egg which allowed him to release version 1.0. |
---|
81 | |
---|
82 | ...and [[http://wiki.call-cc.org/users/moritz-heidkamp|Moritz Heidkamp]] started on a replacement for the |
---|
83 | [[http://wiki.call-cc.org/eggref/4/environments|Environments Egg]] as it has unfortunately has been overtaken |
---|
84 | by developments in the Chicken development branch. |
---|
85 | |
---|
86 | Pictures are up in the [[http://www.call-cc.org/pictures/t-dose2011/|usual place]] on the Chicken website. |
---|
87 | |
---|
88 | |
---|
89 | |
---|
90 | == 2. Chicken Talk |
---|
91 | |
---|
92 | === R7RS to be dedicated to the memory of John McCarthy |
---|
93 | |
---|
94 | Matt Welland wrote in with the sad news that the "Father of Lisp", John McCarthy had sadly passed away ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00115.html|2011/10/25 15:59Z]]). [[http://wiki.call-cc.org/users/john-cowan|John Cowan]], member of the R7RS working group, told us that R7RS, |
---|
95 | the upcoming version of the Scheme standard, would be dedicated to his memory ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00116.html|16:22Z]]) |
---|
96 | |
---|
97 | |
---|
98 | === Parallel build patch for Chicken Makefile |
---|
99 | |
---|
100 | A lively discussion broke out on the [[https://wiki.call-cc.org/mailing-lists|Chicken Users mailing list]] regarding |
---|
101 | [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00025.html|parallelisation of the Chicken build process]]. |
---|
102 | |
---|
103 | Vitaly Magerya supplied a [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00025.html|patch]] (2011/10/06 12:37Z) to fix some problems |
---|
104 | he'd been having with builds failing when specifying the {{-j}} to {{gmake}}. |
---|
105 | [[http://wiki.call-cc.org/users/mario-domenech-goulart|Mario Domenech Goulart]] noted that this functionality was already being |
---|
106 | addressed by [[http://bugs.call-cc.org/ticket/526|ticket 526]] |
---|
107 | ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00027.html|2011/10/06 12:39Z]]) and Vitaly was keen to see it committed |
---|
108 | soonly as he maintains the FreeBSD port and people had been asking him for parallel builds ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00028.html|2011/10/06 14:24Z]]). Whilst still keen, [[http://wiki.call-cc.org/users/mario-domenech-goulart|Mario]] [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00029.html|advised caution]] as he wanted to see it proven ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00031.html|2011/10/06 14:40Z]]). |
---|
109 | |
---|
110 | Vitaly was keen to push things forward ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00033.html|2011/10/06 15:45Z]]) and |
---|
111 | offered continued testing under FreeBSD 8.2-RELEASE on x86_64. He noted that, as far as he could tell, {{gmake check}} passed when using his |
---|
112 | patch, modified with [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00026.html|Moritz Wilhelmy's suggestions]]. Moreover, he |
---|
113 | offered to try the patch from [[http://bugs.call-cc.org/ticket/526|ticket 526]] as well. |
---|
114 | |
---|
115 | [[http://wiki.call-cc.org/users/mario-domenech-goulart|Mario]] [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00034.html|suggested]] |
---|
116 | that using the [[http://bugs.call-cc.org/ticket/526|ticket 526]] patch was a good idea as it had, as far as he knew, received testing under Linux and MacOSX. |
---|
117 | |
---|
118 | Toby Thain spoke in favour of the patch, saying that a working parallel build gives confidence that the Makefile is, in fact, correct. |
---|
119 | He offered to test on three platforms, namely Solaris 10 SPARC SMP and both PowerPC and Intel version of MacOSX SMP. |
---|
120 | |
---|
121 | Vitaly updated the [[http://bugs.call-cc.org/ticket/526|ticket 526]] patch to the then current sources and confirmed that the build worked at {{-j8}} |
---|
122 | and the tests passed in his FreeBSD 8.2-RELEASE, x86_64 environment. He did, however, note that parallelisation does not work for the install phase |
---|
123 | ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00048.html|2011/10/08 12:29Z]]). |
---|
124 | |
---|
125 | Toby Thain reported successful builds on the 64-bit version MacOSX-10.6 as well as MacOSX-10.5 on a dual-processor G5. He noted "{{make -j8}} |
---|
126 | reduces the make step from 3:39 to 0:47 on my 8-core system". Unfortunately {{make check}} did not pass on either system, with or without the patch |
---|
127 | ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00071.html|2011/10/12 01:59Z]] & |
---|
128 | [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00100.html|2011/10/15 19:53Z]]) |
---|
129 | |
---|
130 | [[http://wiki.call-cc.org/users/christian-kellermann|Christian Kellermann]] noted that it might necessary to install the compiled binaries |
---|
131 | ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00101.html|2011/10/15 20:07Z]]) however, Toby did not report back as to whether this |
---|
132 | had any effect on the results of the tests. |
---|
133 | |
---|
134 | |
---|
135 | === 64-bit SPARC Build |
---|
136 | |
---|
137 | Nicolas Pelletier came to the [[https://wiki.call-cc.org/mailing-lists|mailing list]] |
---|
138 | unable to build for Solaris 10 running on SPARC64 due to a missing {{apply-hack.S}} |
---|
139 | ([[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00012.html|2011/11/09 11:48Z]]). |
---|
140 | |
---|
141 | It turned out that there was no SPARC64 support for Chicken at all and [[http://wiki.call-cc.org/users/john-cowan|John Cowan]] |
---|
142 | came to the rescue ([[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00013.html|15:36Z]]) |
---|
143 | with instructions for how to add it to the supported architectures list and disable the |
---|
144 | apply hack. [[http://wiki.call-cc.org/users/christian-kellermann|Christian Kellermann]] chimed in with affirmations |
---|
145 | around the utility of using Chicken without an apply hack ([[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00014.html|15:54Z]]) |
---|
146 | |
---|
147 | Nicolas struggled with disabling the apply hack ([[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00015.html|2011/11/10 11:10Z]]) |
---|
148 | due to the Two Lies Of The README. Over the course of the next few minutes [[http://wiki.call-cc.org/users/christian-kellermann|Christian]] |
---|
149 | and [[http://wiki.call-cc.org/users/mario-domenech-goulart|Mario Domenech Goulart]]] |
---|
150 | confirmed that the lies, which related to the way bootstrap compilers are distributed and invoked, had |
---|
151 | already been fixed in the development versions. |
---|
152 | |
---|
153 | Meanwhile, Toby Thain tried the build on his SPARC64 ([[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00020.html|12:40Z]]) |
---|
154 | and discovered that GNU make 3.82 is required as well as the addition of {{-lrt}} in {{Makefile.solaris}}. Toby's |
---|
155 | build eventually succeeded and appeared to be good, albeit having only used 1 of his 4 CPUs and with a couple of {{make check}} errors. |
---|
156 | |
---|
157 | Later on the Thursday, [[http://wiki.call-cc.org/users/jim-ursetto|Jim Ursetto]] noted ([[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00021.html|16:47Z]]) |
---|
158 | that the [[http://bugs.call-cc.org/raw-attachment/ticket/526/parallel-build-2.diff.txt|parallel build patch]] in |
---|
159 | [[http://bugs.call-cc.org/ticket/526|ticket 526]] still works on Chicken 4.7.0.3-st. Toby [[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00022.html|confirmed]] |
---|
160 | that the patch did indeed work on Solaris and build time was reduced to 10 just of his Earth minutes from the original 40. |
---|
161 | Of course, user time across the four CPUs was still in the region of 40 minutes in total. :-) |
---|
162 | |
---|
163 | To round everything off, Toby offered [[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00028.html|binary SYSV packages for Solaris 10 on SPARC64]]. |
---|
164 | Contact him via the [[https://wiki.call-cc.org/mailing-lists|mailing list]] if you're interested. |
---|
165 | |
---|
166 | |
---|
167 | === Static Linking & Standalone Binaries. |
---|
168 | |
---|
169 | Serg Kozhemyakin [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00105.html|asked]] whether it is possible to build static |
---|
170 | binaries after having trouble using the {{-static}} flag to {{csc}}. He also wondered about building standalone binaries for Windows. |
---|
171 | [[http://wiki.call-cc.org/users/christian-kellermann|Christian Kellermann]] [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00106.html|advised]] |
---|
172 | against static linking as many of the eggs cannot cope with it. He did, however, suggest that the {{-deploy}} option may well solve both |
---|
173 | issues as it ensures that all the DLLs (including the Chicken runtime and other shared objects) are bundled together into a single directory. |
---|
174 | |
---|
175 | |
---|
176 | === Tracing with {{,tr}} moved to an egg |
---|
177 | |
---|
178 | [[http://wiki.call-cc.org/users/mario-domenech-goulart|Mario Domenech Goulart]] [[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00007.html|helped]] |
---|
179 | Curtis Cooley in his [[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00006.html|search for the {{,tr}} command]]. |
---|
180 | The functionality had been moved from the core into an egg in Chicken 4.3.0. |
---|
181 | |
---|
182 | |
---|
183 | === {{gmake check}} sometimes fails. |
---|
184 | |
---|
185 | Pekka Niiranen wrote to tell us about |
---|
186 | [[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00009.html|problems with {{gmake check}} in Chicken 4.7.0-st]] |
---|
187 | on OpenBSD 5.0. |
---|
188 | |
---|
189 | [[http://wiki.call-cc.org/users/jim-ursetto|Jim Ursetto]] [[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00010.html|said]] |
---|
190 | that one of the failures had been fixed in the stability branch after the Chicken 4.7.0-st release and he filed |
---|
191 | [[https://bugs.call-cc.org/ticket/724|ticket 724]] for the segmentation fault issue. |
---|
192 | |
---|
193 | [[http://wiki.call-cc.org/users/peter-bex|Peter Bex]] mentioned that the [[https://bugs.call-cc.org/ticket/724|ticket 724]] segmentation |
---|
194 | fault had also been observed under NetBSD and Arch Linux. He said that "It's known to be broken" but that it is not properly reproducible |
---|
195 | as it only happens some of the time ([[http://lists.nongnu.org/archive/html/chicken-users/2011-11/msg00011.html|2011/11/06 09:51|]]). |
---|
196 | |
---|
197 | |
---|
198 | == 3. Salmonella and other tests |
---|
199 | Salmonella is Chicken's egg testing framework. |
---|
200 | |
---|
201 | For some time we have had daily salmonella runs of the master development |
---|
202 | version of Chicken under Linux on x86. Throughout November, MacOSX-x86_64 has also |
---|
203 | been regularly experiencing the runs. [[http://wiki.call-cc.org/users/mario-domenech-goulart|Mario Domenech Goulart]] who maintains the testing |
---|
204 | effort at [[http://tests.call-cc.org/]], as well as the [[https://github.com/mario-goulart/salmonella|Salmonella codebase]] |
---|
205 | itself, is always on the lookout for more feeds. We are aware that testing on |
---|
206 | other platforms is being organised but if you've got a private Salmonella |
---|
207 | running regularly on an interesting operating system or version of Chicken then |
---|
208 | give us a shout and we'll see if we can get it included with the other reports |
---|
209 | on [[http://tests.call-cc.org/]] |
---|
210 | |
---|
211 | There is also [[https://github.com/mario-goulart/salmonella|an entirely new version of Salmonella]] over at github so test that too. The new version is more modular -- some features that were previously built in salmonella are now independent eggs (e.g., [[https://github.com/mario-goulart/salmonella-html-report|salmonella-html-report]] and [[https://github.com/mario-goulart/salmonella-feeds|salmonella-feeds]]. There's also a new egg that provides a new feature: [[https://github.com/mario-goulart/salmonella-diff|salmonella-diff]] which generates HTML output to render differences between two salmonella logs. |
---|
212 | |
---|
213 | Here's short list of new salmonella features: |
---|
214 | |
---|
215 | * egg lint mode: salmonella can now easily check for common egg mistakes before the code hits the egg repository. Just run {{salmonella --this-egg}} from the egg directory |
---|
216 | * a new execution mode that can significantly reduce salmonella execution times. In this mode, salmonella won't set the temporary egg installation directory empty before installing new eggs. While this mode won't spot egg dependencies problems, it can drastically effect the execution time |
---|
217 | * a new tool to take advantage of multi-core systems ({{salmonella-epidemy}}) |
---|
218 | * a simple text mode log file viewer ({{salmonella-log-viewer}}) |
---|
219 | * [[https://github.com/mario-goulart/salmonella-html-report|salmonella-html-report]] generates reverse dependencies graphs. That can be useful, for |
---|
220 | example, to ilustrate how many eggs depend on a given egg. |
---|
221 | |
---|
222 | |
---|
223 | [[http://wiki.call-cc.org/users/alaric-blagrave-snellpym|Alaric Snell-Pym]] is one of the people who has been setting up a Chicken testing |
---|
224 | environment. After [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00068.html|some discussion]], he chose Chicken 4.5.0 under |
---|
225 | NetBSD ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00035.html|2011/10/06 21:18Z]]). He's been keeping track of all the |
---|
226 | Egg dependencies and plans to publish them as a list of NetBSD pkgsrc packages. |
---|
227 | |
---|
228 | Thanks to [[http://www.bevuta.com/|bevuta IT GmbH]], the CHICKEN test |
---|
229 | infrastructure will soon have more machines available to test the |
---|
230 | CHICKEN compiler, tools and eggs. A new salmonella environment for |
---|
231 | Linux/x86-64 is currently being set up. |
---|
232 | |
---|
233 | In addition to salmonella, work on the |
---|
234 | [[http://wiki.call-cc.org/playground|Chicken Playground]] project has |
---|
235 | been resumed. The Chicken Playground project provides environments |
---|
236 | that can be used by tools like {{chroot}} to test CHICKEN tools and |
---|
237 | eggs. Those environments contain tools and libraries required to |
---|
238 | build and test most eggs. Currently a Linux/x86 environment is |
---|
239 | available. A Linux/x86-64 environment is under development and should |
---|
240 | be available soon. |
---|
241 | |
---|
242 | The new test infrastructure, based on new versions of salmonella and |
---|
243 | Chicken Playground and running on new platforms will probably go into |
---|
244 | production during the Nuremberg hackaton. |
---|
245 | |
---|
246 | |
---|
247 | == 4. Core Development |
---|
248 | |
---|
249 | Since the last issue most core development took place in the |
---|
250 | "scrutinizer", the flow-analysis pass used for determining the number |
---|
251 | and types of values as they propagate through Scheme expressions. The |
---|
252 | results of this analysis is now used to replace various primitive |
---|
253 | operations by more efficient code, taking advantage of the obtained |
---|
254 | type information. Over the last months the typing and rewrite rules of |
---|
255 | all core library procedures (which can be found in the installed |
---|
256 | "types.db" file) have been heavily improved and debugged. Depending on |
---|
257 | the nature of the code, these optimizations can result in significant |
---|
258 | performance improvements. For more information on specialisation see |
---|
259 | the respective section at |
---|
260 | [[http://library.readscheme.org/page10.html|readscheme.org]]. |
---|
261 | |
---|
262 | A couple of months ago the CHICKEN team has formalised the development |
---|
263 | process a bit as can be seen on |
---|
264 | [[http://wiki.call-cc.org/development-process|its wiki page]]. Others |
---|
265 | already joined in the discussion of patches on chicken-hackers and you |
---|
266 | are more than welcome to join in. |
---|
267 | |
---|
268 | As more people are trying git checkouts, the question of how to |
---|
269 | bootstrap a git checkout properly keeps reappearing on the mailing |
---|
270 | list. So the steps are: |
---|
271 | |
---|
272 | * Build a [[http://code.call-cc.org|stable release]] or a [[http://code.call-cc.org/dev-snapshots|development snapshot]] |
---|
273 | * Checkout chicken-core from git (see [[http://code.call-cc.org]]) |
---|
274 | * Build a boot-chicken: {{make boot-chicken}} |
---|
275 | * Use this chicken to build the real chicken: {{make CHICKEN=./chicken-boot}} |
---|
276 | * Install the chicken and run tests: {{make install && make check}} |
---|
277 | |
---|
278 | |
---|
279 | sparc64 |
---|
280 | mario, felix |
---|
281 | lots of bug fixes, sparc64 support |
---|
282 | |
---|
283 | * On origin/master: |
---|
284 | * (e1a5437): when conditional branches differ in the number of results, do not merge the results (felix, 2 days ago) |
---|
285 | * (bae7d92): clustering optimization added (felix, 5 weeks ago) |
---|
286 | * (b1907c5): use different default stack-sizes on 32/64 bit platforms (felix, 6 days ago) |
---|
287 | * (986bd3f): disable apply-hack on sparc64 (felix, 6 days ago) |
---|
288 | * (28a36bf): Remove scripts/make-egg-rss-feed.scm (imported into the chicken-infrastructure repo) (Mario Domenech Goulart, 5 days ago) |
---|
289 | * (fbeffd1): scripts/tools.scm: needs regex for `string-match' (Mario Domenech Goulart, 5 days ago) |
---|
290 | * (1fca9c6): use equal? in case MSYSTEM is not defined (makedist.scm) (felix, 6 days ago) |
---|
291 | * (42a8263): don't remove build-info files on make confclean or it is not possible to build from a tarball without preinstalled chicken (felix, 9 days ago) |
---|
292 | * (3bb9645): write debugging output for optimizations into generated source file (felix, 3 weeks ago) |
---|
293 | * (e7fe2fb): allow procedure in operator-position of evaluated list (#705, suggested by John Cowan) (felix, 2 weeks ago) |
---|
294 | * (e2fb31c): fix subtype check for fixed-size list/vector types in scrutinizer (felix, 10 days ago) |
---|
295 | * (fd018df): strip std-envs of non-std identifiers, ignore ##sys#macro-environment when evaluating with an explicit environment (felix, 13 days ago) |
---|
296 | * (fe8f63c): minor change in port-tests.scm to handle case when HOME is not defined (Windows) (felix, 2 weeks ago) |
---|
297 | * (723a469): cut of union types above a certain length (felix, 2 weeks ago) |
---|
298 | * (919a7c7): fixes in build + Windows test script, added note to README (thanks to mario) (felix, 2 weeks ago) |
---|
299 | * (ddb96f9): Also added runtests.bat to manifest. (felix, 3 weeks ago) |
---|
300 | * (0df9bb8): another trivial fix for making boot-chicken work on cmd.exe (felix, 3 weeks ago) |
---|
301 | * (cea668f): trivial Windows-related corrections in rules.make, found by Mario - not yet working, though (felix, 3 weeks ago) |
---|
302 | * (1bc311d): undocumented scrutinize declaration (obsolete), reported by ckeen (felix, 3 weeks ago) |
---|
303 | * (10494f6): fixed stupid paren-matching error (felix, 3 weeks ago) |
---|
304 | * (f9a6702): disable debug output in scrutinizer (felix, 5 weeks ago) |
---|
305 | * (2483f8d): check not necessary for lambda and warn if using keyword as variable in binding form (felix, 3 weeks ago) |
---|
306 | * (aa6b2bb): cleaning up uninitialized variables in C_reclaim, add debug output to C_mutate on m-stack resize, grow m-stack at higher rate (felix, 3 weeks ago) |
---|
307 | * (1e04156): use write-string port-class method (felix, 3 weeks ago) |
---|
308 | * (59cdaaf): remove obsolete C_h_... allocation functions (pointed out by Joerg Wittenberger) (felix, 3 weeks ago) |
---|
309 | * (159611d): handle macro-aliases when resolving declared identifier, making sure things are done right inside modules. (felix, 4 weeks ago) |
---|
310 | * (0cc88a4): removed obsolete file (felix, 4 weeks ago) |
---|
311 | * (1f56f3a): ##core#type makes subtype-check optional; quit compile when type-mismatches in strict mode (felix, 5 weeks ago) |
---|
312 | |
---|
313 | |
---|
314 | == 5. Stability is for Chickens |
---|
315 | |
---|
316 | [[http://wiki.call-cc.org/users/jim-ursetto|Jim Ursetto]] has set up a Chicken Stability Branch |
---|
317 | effort over at [[http://wiki.call-cc.org/stability]]. Jim describes it as "a fork of the Chicken |
---|
318 | Scheme core which backports certain useful bugfixes and minor features from the future to 'stable' |
---|
319 | maintenance versions". Releases for stability/4.7.0 have version numbers like {{4.7.0.x-st}} (for |
---|
320 | example, {{4.7.0.1-st}}). If you're interested in running a stable Chicken in production, we recommend |
---|
321 | that you check out Jim's work. |
---|
322 | |
---|
323 | |
---|
324 | |
---|
325 | == 6. Hatching Farm |
---|
326 | |
---|
327 | There has been a lot of egg activity over the course of the past few months. I've selected a few, |
---|
328 | focussing on ones that were announced or discussed on the [[https://wiki.call-cc.org/mailing-lists|mailing list]]. |
---|
329 | |
---|
330 | TODO: Write about the distributed egg repository |
---|
331 | |
---|
332 | By far the most notable thing to have happened is the announcment and implementation of the new |
---|
333 | Egg management system. |
---|
334 | |
---|
335 | * [[http://wiki.call-cc.org/users/ivan-raikov|Ivan Raikov]]'s [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00058.html|proposal]] |
---|
336 | to recategorise eggs filed under "Uncategorized or invalid" and "Miscellaneous" was met with enthusiasm with a number of people pitching in to |
---|
337 | help as well as [[http://wiki.call-cc.org/users/peter-bex|Peter Bex]] suggesting that the category list be revisited |
---|
338 | ([[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00064.html|2011/10/11 08:12Z]]). [[http://wiki.call-cc.org/users/peter-bex|Peter]] |
---|
339 | specifically suggested the addition of a "Communication"s category. |
---|
340 | |
---|
341 | * [[http://wiki.call-cc.org/users/thomas-chust|Thomas Chust]] announced some new eggs: [[http://www.chust.org/fossils/webkit|bindings to WebKitGTK+ and JavaScriptCore]], [[http://www.chust.org/fossils/webgate|webgate: a tiny (S)CGI application framework]] and a [[http://www.chust.org/fossils/berkeley-db|small binding for the BerkelyDB library]] |
---|
342 | |
---|
343 | * [[http://wiki.call-cc.org/users/christian-kellermann|Christian Kellermann]] |
---|
344 | [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00103.html|fixed some bugs]] in the |
---|
345 | [[http://wiki.call-cc.org/eggref/4/cairo|Cairo Egg]] and tagged version 0.1.11. |
---|
346 | |
---|
347 | * [[http://wiki.call-cc.org/users/alyn.post|Alan Post]] [[http://lists.nongnu.org/archive/html/chicken-users/2011-10/msg00001.html|patched]] the |
---|
348 | [[http://wiki.call-cc.org/eggref/4/sandbox|Sandbox Egg]] to bring it up-to-date with API changes in the Chicken core. His patch was duly accepted. |
---|
349 | |
---|
350 | * [[user:moritz-heidkamp|Moritz Heidkamp]] released the [[egg:stemmer|stemmer]] egg which provides bindings for the [[http://snowball.tartarus.org/|Snowball project's]] libstemmer. |
---|
351 | |
---|
352 | |
---|
353 | |
---|
354 | == 7. Donations |
---|
355 | |
---|
356 | It's now possible to donate to your favourite scheme (as long as it's Chicken)! |
---|
357 | |
---|
358 | [[http://wiki.call-cc.org/donate]] |
---|
359 | |
---|
360 | We've already had two donations since the account opened a month ago so get donating before it fills up! :-) |
---|
361 | |
---|
362 | Thank you [[http://wiki.call-cc.org/users/sven-hartrumpf|Sven Hartrumpf]] and Ross Lonstein! |
---|
363 | |
---|
364 | |
---|
365 | == 8. Omelette Recipes |
---|
366 | |
---|
367 | This issue's omelette is the second installment of |
---|
368 | [[http://wiki.call-cc.org/users/alaric-blagrave-snellpym|Alaric Snell-Pym]]'s |
---|
369 | "financial book-keeping in scheme" series. If you missed the first part, |
---|
370 | check it out [[http://gazette.call-cc.org/issues/20.html#omelette-recipes|here]]. |
---|
371 | |
---|
372 | Now, to make things easy, I parse the ledger by just defining a heap |
---|
373 | of procedures and macros, and then diving into the ledger with |
---|
374 | eval. It's just Scheme code that, as it is executed, builds up the |
---|
375 | data structures. We'll need some helpers to set up third parties |
---|
376 | properly: |
---|
377 | |
---|
378 | <enscript> |
---|
379 | (define (define-third-party name address group) |
---|
380 | (let* ((balance-account |
---|
381 | (make-account |
---|
382 | (string-append name ".balance") |
---|
383 | 'balance |
---|
384 | group |
---|
385 | #f)) |
---|
386 | (expenses-account |
---|
387 | (make-account |
---|
388 | (string-append name ".expenses") |
---|
389 | 'delta |
---|
390 | 'expenses-reclaimed |
---|
391 | #f)) |
---|
392 | (third-party |
---|
393 | (make-third-party |
---|
394 | name address balance-account expenses-account))) |
---|
395 | (account-third-party-set! balance-account third-party) |
---|
396 | (account-third-party-set! expenses-account third-party) |
---|
397 | (register-account! balance-account) |
---|
398 | (register-account! expenses-account) |
---|
399 | (set! (hash-table-ref *third-parties* name) third-party))) |
---|
400 | </enscript> |
---|
401 | |
---|
402 | Now we can work on a way of representing bills and invoices. A nice |
---|
403 | input syntax would be: |
---|
404 | |
---|
405 | <enscript> |
---|
406 | (define-third-party "clients.widgetcorp" "123 Any Street" 'clients) |
---|
407 | (register-account! (make-account "income.work" 'delta 'income #f)) |
---|
408 | (register-account! (make-account "expenses.travel" 'delta 'travel #f)) |
---|
409 | (register-account! (make-account "stock.balance" 'balance 'stock #f)) |
---|
410 | (register-account! (make-account "cash" 'balance 'cash #f)) |
---|
411 | (register-account! (make-account "taxes.vat" 'balance 'vat #f)) |
---|
412 | |
---|
413 | (invoice "INV005" "clients.widgetcorp" (ymd 2011 04 25) |
---|
414 | (service "income.work" 800 (vat20) "Router setup and installation") |
---|
415 | (sale "stock.balance" 350 (vat20) "1 of LX300 router, serial number 0343248") |
---|
416 | (expense (ymd 2011 03 02) "expenses.travel" "cash" 35 () "Travel to site")) |
---|
417 | </enscript> |
---|
418 | |
---|
419 | The idea is that the sales taxes incurred on a line are specified as a |
---|
420 | list after the amount. If there's no taxes due, then we use an empty |
---|
421 | list. Otherwise we have a list of taxes, which are either plain tax |
---|
422 | names (to have the system compute the tax due itself) or two-element |
---|
423 | lists joining a tax name to a precomputed amount (often, when we pass |
---|
424 | on an expense, we know the tax we paid as it's on the receipt, so we |
---|
425 | should use that (even if they made a mistake working it out) rather |
---|
426 | than calculating our own). |
---|
427 | |
---|
428 | A nice way to implement that might be to make "invoice" a macro that |
---|
429 | absorbs its first three arguments as an invoice code, the name of the |
---|
430 | third party to invoice, and the date; then treats the rest as a body |
---|
431 | to be wrapped in a dynamic environment in which a parameter allows |
---|
432 | {{sale}}, {{expense}}, and {{service}} to add lines to the |
---|
433 | invoice. This is easily arranged: |
---|
434 | |
---|
435 | <enscript> |
---|
436 | (define-record date year month day) |
---|
437 | |
---|
438 | (define-record invoice |
---|
439 | name date third-party lines) |
---|
440 | |
---|
441 | (define (register-line! invoice line) |
---|
442 | (invoice-lines-set! invoice |
---|
443 | (cons line (invoice-lines invoice)))) |
---|
444 | |
---|
445 | ;; Compute sales taxes |
---|
446 | (define (compute-tax tax amount) |
---|
447 | (case tax |
---|
448 | ((vat20) (* 0.20 amount)) ;; Current UK rate |
---|
449 | ((vat15) (* 0.15 amount)) ;; Previous UK rate |
---|
450 | ((vat175) (* 0.175 amount)))) ;; Previous UK rate |
---|
451 | |
---|
452 | ;; Expand a list of taxes, some of which might be bare symbols |
---|
453 | ;; naming taxes to work out, or (<tax> <amount>) lists for |
---|
454 | ;; ready-computed taxes, into an alist of tax names to tax amounts |
---|
455 | (define (resolve-taxes amount taxes) |
---|
456 | (map (lambda (tax-desc) |
---|
457 | (if (list? tax-desc) |
---|
458 | (cons (car tax-desc) (cadr tax-desc)) |
---|
459 | (cons tax-desc (compute-tax tax-desc amount)))) |
---|
460 | taxes)) |
---|
461 | |
---|
462 | (define-record invoice-service-line |
---|
463 | income-account amount taxes description) |
---|
464 | |
---|
465 | (define-syntax service |
---|
466 | (syntax-rules () |
---|
467 | ((service income-account amount taxes description) |
---|
468 | (register-service! (*current-invoice*) income-account amount 'taxes description)))) |
---|
469 | |
---|
470 | (define (register-service! invoice income-account amount taxes description) |
---|
471 | (let ((service |
---|
472 | (make-invoice-service-line |
---|
473 | (find-account income-account) |
---|
474 | amount |
---|
475 | (resolve-taxes amount taxes) |
---|
476 | description))) |
---|
477 | (register-line! invoice service))) |
---|
478 | |
---|
479 | (define-record invoice-sale-line |
---|
480 | stock-account amount taxes description) |
---|
481 | |
---|
482 | (define (register-sale! invoice stock-account amount taxes description) |
---|
483 | (let ((sale |
---|
484 | (make-invoice-sale-line |
---|
485 | (find-account stock-account) |
---|
486 | amount |
---|
487 | (resolve-taxes amount taxes) |
---|
488 | description))) |
---|
489 | (register-line! invoice sale))) |
---|
490 | |
---|
491 | (define-syntax sale |
---|
492 | (syntax-rules () |
---|
493 | ((sale stock-account amount taxes description) |
---|
494 | (register-sale! (*current-invoice*) stock-account amount 'taxes description)))) |
---|
495 | |
---|
496 | (define-record invoice-expense-line |
---|
497 | expense-account payment-account amount taxes description) |
---|
498 | |
---|
499 | (define (register-expense! invoice date expense-account payment-account amount taxes description) |
---|
500 | (let ((expense |
---|
501 | (make-invoice-expense-line |
---|
502 | (find-account expense-account) |
---|
503 | (find-account payment-account) |
---|
504 | amount |
---|
505 | (resolve-taxes amount taxes) |
---|
506 | description))) |
---|
507 | (register-line! invoice expense))) |
---|
508 | |
---|
509 | (define-syntax expense |
---|
510 | (syntax-rules () |
---|
511 | ((expense (ymd year month day) expense-account payment-account amount taxes description) |
---|
512 | (register-expense! |
---|
513 | (*current-invoice*) |
---|
514 | (make-date year month day) |
---|
515 | expense-account |
---|
516 | payment-account |
---|
517 | amount |
---|
518 | 'taxes |
---|
519 | description)))) |
---|
520 | |
---|
521 | (define *current-invoice* (make-parameter #f)) |
---|
522 | (define *invoices* (make-hash-table)) |
---|
523 | |
---|
524 | (define-syntax invoice |
---|
525 | (syntax-rules (service sale expense) |
---|
526 | ((invoice name third-party (ymd year month day) body ...) |
---|
527 | (let ((inv |
---|
528 | (make-invoice name |
---|
529 | (make-date year month day) |
---|
530 | (hash-table-ref *third-parties* third-party) |
---|
531 | '()))) |
---|
532 | (parameterize |
---|
533 | ((*current-invoice* inv)) |
---|
534 | (begin body ...)) |
---|
535 | (set! (hash-table-ref *invoices* name) inv) |
---|
536 | (generate-invoice-transactions! inv))))) |
---|
537 | </enscript> |
---|
538 | |
---|
539 | We end the expansion of the {{invoice}} macro with a call to |
---|
540 | {{generate-invoice-transactions!}}, which will do the task of creating |
---|
541 | the double-entry transactions for the invoice. Other types of summary |
---|
542 | structure can be added by calling additional generator procedures at |
---|
543 | this point. This is largely a matter of going through the invoice |
---|
544 | lines, handling them on a case-by-case basis to generate lists of |
---|
545 | transaction splits that we can append together to generate the invoice |
---|
546 | transaction. The case of expense lines is interesting, in that an |
---|
547 | extra transaction has to be generated for each expense, to record its |
---|
548 | initial spending, as well as a split to record the expense being |
---|
549 | claimed in the invoice. |
---|
550 | |
---|
551 | For now, let's just handle one case: |
---|
552 | |
---|
553 | <enscript> |
---|
554 | (define (generate-invoice-transactions! inv) |
---|
555 | (register-txn! (make-txn |
---|
556 | (invoice-date inv) |
---|
557 | (string-append "Invoice " (invoice-name inv) " for " |
---|
558 | (third-party-full-name (invoice-third-party inv))) |
---|
559 | (let ((txn-balance-account |
---|
560 | (third-party-balance-account |
---|
561 | (invoice-third-party inv)))) |
---|
562 | (flatten |
---|
563 | (map |
---|
564 | (lambda (line) |
---|
565 | (cond |
---|
566 | ((invoice-expense-line? line) |
---|
567 | (list)) ;; FIXME: Not implemented |
---|
568 | ((invoice-sale-line? line) |
---|
569 | (list)) ;; FIXME: Not implemented |
---|
570 | ((invoice-service-line? line) |
---|
571 | (list |
---|
572 | (make-txn-split |
---|
573 | (invoice-service-line-income-account line) |
---|
574 | (- (invoice-service-line-amount line)) |
---|
575 | (invoice-service-line-description line)) |
---|
576 | (make-tax-splits |
---|
577 | (invoice-service-line-taxes line) |
---|
578 | txn-balance-account) |
---|
579 | (make-txn-split |
---|
580 | txn-balance-account |
---|
581 | (invoice-service-line-amount line) |
---|
582 | #f))))) |
---|
583 | (invoice-lines inv))))))) |
---|
584 | |
---|
585 | (define (make-tax-splits taxes txn-balance-account) |
---|
586 | (map (lambda (tax) |
---|
587 | (let ((tax-type (car tax)) |
---|
588 | (tax-amount (cdr tax))) |
---|
589 | (case tax-type |
---|
590 | ((vat20 vat15 vat175) |
---|
591 | (list |
---|
592 | (make-txn-split |
---|
593 | (find-account "taxes.vat") |
---|
594 | (- tax-amount) |
---|
595 | #f) |
---|
596 | (make-txn-split |
---|
597 | txn-balance-account |
---|
598 | tax-amount |
---|
599 | #f)))))) |
---|
600 | taxes)) |
---|
601 | </enscript> |
---|
602 | |
---|
603 | Feeding in the above example invoice, then checking out the resulting |
---|
604 | double-entry transaction list, shows that it worked: |
---|
605 | |
---|
606 | <enscript> |
---|
607 | (hash-table-for-each *txns* |
---|
608 | (lambda (date txns) |
---|
609 | (for-each |
---|
610 | (lambda (txn) |
---|
611 | (printf "Date: ~A Desc: ~A\n" |
---|
612 | (txn-date txn) |
---|
613 | (txn-description txn)) |
---|
614 | (for-each (lambda (split) |
---|
615 | (printf "Acct: ~A Delta: ~A Notes: ~A\n" |
---|
616 | (account-name (txn-split-account split)) |
---|
617 | (txn-split-amount split) |
---|
618 | (txn-split-notes split))) (txn-splits txn))) |
---|
619 | txns))) |
---|
620 | </enscript> |
---|
621 | |
---|
622 | date: #<date> Desc: Invoice INV005 for Widget Corp |
---|
623 | Acct: income.work Delta: -800 Notes: Router setup and installation |
---|
624 | Acct: taxes.vat Delta: -160.0 Notes: #f |
---|
625 | Acct: clients.widgetcorp.balance Delta: 160.0 Notes: #f |
---|
626 | Acct: clients.widgetcorp.balance Delta: 800 Notes: #f |
---|
627 | |
---|
628 | We've ended up with multiple splits for the same account, as we record |
---|
629 | that both VAT and the money due for the service are to come from the |
---|
630 | client's balance account - and other splits will add plenty more. To |
---|
631 | fix this, we need to write a procedure that canonicalises a list of |
---|
632 | splits, and call that on the splits before calling |
---|
633 | {{make-txn}}. Canonicalisation consists of finding all the splits that |
---|
634 | refer to the same account and have the same notes (be it {{#f}} or a |
---|
635 | string) and merging them into one with the total of the amounts. But |
---|
636 | I'll leave that (along with implementing bills, payments, and some |
---|
637 | actual reports) as an exercise to the reader... It's easy to imagine |
---|
638 | how to generate a VAT report from the list of transactions, by |
---|
639 | filtering them for membership of the required date range and looking |
---|
640 | for splits involving "taxes.vat", or to generate a nicely formatted |
---|
641 | invoice by extracting a single invoice record, or to work out the |
---|
642 | balance of an account at any point in time by adding up all the |
---|
643 | transaction splits that involve it up to that point in time. Also, the |
---|
644 | core engine needs to be wrapped up in a module that only exposes the |
---|
645 | required bindings, and hides internals. |
---|
646 | |
---|
647 | Having automated one's book-keeping and financial reporting, many |
---|
648 | operations (such as the VAT returns) can be done without involving an |
---|
649 | accountant; in my case, the accountant is only needed to help with the |
---|
650 | annual corporation tax computation and filing of official accounts, |
---|
651 | which requires deep understanding of the UK tax system to do |
---|
652 | everything properly. Having said that, if I studied the system |
---|
653 | properly (and tracked the changes each year), I'm sure I could |
---|
654 | automate that, too... |
---|
655 | |
---|
656 | == 9. About the Chicken Gazette |
---|
657 | |
---|
658 | The Gazette is produced occasionally by a volunteer from the Chicken |
---|
659 | community. The latest issue can be found at |
---|
660 | [[http://gazette.call-cc.org]] or you can follow it in your feed |
---|
661 | reader at [[http://gazette.call-cc.org/feed.atom]]. If you'd like to |
---|
662 | write an issue, [[http://wiki.call-cc.org/gazette|consult the wiki]] |
---|
663 | for the schedule and instructions! |
---|