]> git.donarmstrong.com Git - lilypond.git/blob - TODO
release: 1.1.33
[lilypond.git] / TODO
1 -*-outline-layout:(2 (-1 -1 0 :) 0);outline-stylish-prefixes:nil -*-
2
3 * GNU LilyPond TODO
4 Features you cannot find in the doco as working, should be
5 mentioned here.  This is an assorted collection of stuff that will be
6 done, might be done, or is an idea that I want to think about
7
8 Most of the items are marked in the code as well
9 Grep for TODO and ugh/ugr/urg.  
10
11 .* BUGS
12 . * .ly files
13 .  * input/star-spangled-banner
14 .  * mutopia/J.S.Bach/wtk1-fugue2.ly
15 .  * input/test/grace
16 .  * fix: text on rests: ridiculous dims
17 . * m=\notes\relative c'''{
18   \time 2/4;
19
20   R2*4 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | \break
21   <{R2*10}{s2 \mark "A"; }> | % Too narrow space for the first rest in
22 1.1.29
23   r4 r8 [g16 \p ( a ] |
24 [ ) g8-. fis16 ( g ][ ) fis8-. f16 ( g ] |
25 [ ) f8-. e16 ( f ][ ) e8-. es16 ( f ] |
26 [ ) es8 \f c16 ( d][es8 d16 c ] |
27 ) d4 r8 [g16 \p ( a ] |
28 [ ) g8-. fis16 ( g ][ ) fis8-. f16 ( g ] | \break
29 ) c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 | c2 |
30 }
31
32 \score{
33   \m
34   \paper{
35     \translator{
36       \ScoreContext
37       SkipBars = 1;
38     }
39     \translator {
40       \OrchestralPartStaffContext
41     }
42   }
43 }
44 . * - Look at input/test/span-bars.ly. The staff lines extend too far
45   to the left on the note systems including the GrandStaff.
46 . * fix midi output:
47 .  * default duration?  d
48      duration must be not entered explicitely on first note.
49 . * fix singleStaffBracket
50 . * \shape 1st dim skipped? 
51 . * turn slope-damping on/off
52 . * tremolo stuff
53 . * fix height of / collisions with lyrics (chords), 
54     see input/test/vertical-text.ly; input/test/repeat.ly
55 . * We need feta-din*.mf files for more sizes than 10.
56 . * latex bla.tex broken (titles / \lilyfooter stuff?)
57 . * fix dynamics decently, ie. use kerning & ligatures.  
58 . * support_l_arr_ empty in staff-margin's G_staff_side_item
59 . * minVerticalAlign for StaffGroups.
60 . * fix OrchestralScore and Hara-kiri (i.e., fix Coriolan)
61 . * Phrasing:  Indicating the textual underlay of a piece, or
62 otherwise dividing a piece into phrases.
63
64 There are distinct ways of specifying the first two (although at
65 present, they're not properly distinguished) but no distinct way to
66 specify the third.  Should there be?
67
68 .* TODO before 1.2
69 . * Gade score
70 .  * In the score, the staff lines extend too far to the left. 
71   This is also illustrated in the second score of span-bars.ly
72   as I've pointed out earlier.
73 .  *m=\notes\relative c''{
74   \property Staff.instr = "Instr   "
75     \key f;
76     f4 \p \< g a bes | 
77     c d e \f \! f |
78     f e d c |
79     bes \mf a g f \pp
80   }
81
82 n=\notes\relative c'{
83   \property Staff.instr = "Instr   "
84     \key f;
85     f4 \mp g a \< bes | 
86     c d e \ff \! f |
87     f e d c |
88     bes \mp a g f \ppp
89   }
90
91 \score{
92   \type StaffGroup <
93     \type Staff = a <{\stemup \property Voice.dynamicDir = \down \m}
94                      {\stemdown \property Voice.dynamicDir = \up \n}>
95   >
96 }
97 .  * The minimum distance between different staffs works only within 
98   StaffGroups, not between StaffGroups. The Gade Score looks quite
99   strange on the pages where the Timpani and/or Brass sections don't
100   play. I've set the minimum distance with:
101     \translator {
102        \OrchestralScoreContext
103         minVerticalAlign = 2.5*\staffheight;
104     }
105
106  I sent a copy of the score to the conductor and his reaction was
107   that it would be easy to fix some "spacing problems" with Finale,
108   if we could convert the score to Finale. I'm not sure what he
109   meant, since we just have had mail conversations so far. Maybe
110   it's the staff distances I mentioned above.
111
112 .  * For the trumpet and horn parts, I wrote two parts on the same
113   staff line in the score. I haven't managed to get different
114   directions of the dynamics for the two parts. 
115   Voice.dynamicDir seems to set the direction for the full staff.
116 . *  hangOnClef with non-breakable clefs.
117 . * use an alist for Score_elem "properties".
118 . * Check gcc 2.8.1 compatibility
119 . * Document source code.
120 . * limit memory usage; the full coriolan takes up too much resources.
121 .  * Sort items after breaking in order of linenumber.  Then be more
122      eficient with finding 
123 .  * Do Mark & sweep GC for Score_elems, junk backlinks.
124 . * make "in-between" engraver (Tie, Extender)
125 . * use Drul_array for Interval.
126 . * compulsory hshift
127 . * ties to tie only notes of the same pitch, so that
128         < a~  a,>  a
129 works as you'd expect it to.
130 . * 1. Can Lily be told where to start numbering?
131 . * do scaled fonts.
132 . * profile atom smobs
133 . * Try to use Killing_cons iso. Pointer_list
134 . * make dependencies () a virtual function.
135 . * fix Repeated_music design
136 . * one big ly2dvi input that includes *all* tests.
137 . * Don't use boolean properties (0,1), instead check existence
138 of property.
139 . * store req -> element, element -> element causes for warnings
140 . * junk Text_def, use G_text_item in stead.
141 . * junk Script_def
142 . * fix partial measures in meaningful way.
143 . * fix AFM for BlueSky AFM files.
144 . * working notehead style.
145 . * remove links to non-free SW.
146 . * add scripts to bars eg.  |^"bla" 
147 . * relative mode for mi2mu
148 . * uniformise recent feta contributions.
149 .  * use SCM and Molecules for {accordeon stuff, }
150 .  * bigger and fatter 4/4 C
151 . * sort out directory stuff.
152 .  * --prefix option?
153 .  * -I option per filetype?
154 .  * kpathsea?
155 . * todo doc left/rightbeamcount
156 . * doc Single_malt_grouping_item
157 . * ly2dvi/lilypond logfile.
158 . * How can I specify a chord whose duration is longer than a whole note?
159  \type ChordNames { \chord{ A1*2-min } }
160
161 gives me a parse error.  And \times doesn't work either.  I can't use
162 a spacer note.  So it seems to be impossible to have long chords of
163 general length.  Of course, in the example above I can use \breve.
164 But what if I want a chord that lasts for 3 whole notes?  Or what
165 about 2.5 whole notes?  Is there a mechanism for getting this kind of
166 length?  
167
168
169
170 Use of semicolons is still rather confusing.  They are obligatory
171 after some types of assignments and illegal after others.  
172
173   \property foo=bar               illegal
174   foo = 3 at top level            illegal
175   foo = 3 inside \paper           obligatory               
176   foo = \notes{ ...} top level    illegal
177   foo = \translator{ } in \paper  obligatory
178
179 As far as I can tell, the sole accomplishment of this syntactic
180 irregularity is to keep the user as confused as possible.  
181
182
183 I was trying to get interstaff beams to work and did this:
184
185 \score{
186 \type GrandStaff <
187 \type Staff=one \notes\relative c'{
188   \stemup
189   [c8 c \translator Staff=two \stemup c c]
190   \translator Staff=one
191   \stemdown 
192   [ b8 \translator Staff=two a8]
193   \translator Staff=one 
194   c4 
195   }
196 \type Staff=two \notes{ \clef bass; s1 }
197 >
198 \paper{
199                 \translator{
200                         \GrandStaffContext
201                         minVerticalAlign = 3.0*\staffheight;
202                         maxVerticalAlign = 3.0*\staffheight;
203                 }
204   linewidth = -1.;
205 }
206 }
207
208 The beams are at the right angle, but they aren't in the right place.
209 . * fractional chord durs.
210 . * hang Item on Spanner
211 . * remove Interval dim_ from Dimension_cache and rename the struct.
212 . * do --safe for PS output?
213 . * convert-mudela --output
214 . * Staff_margin (with a partial measure.)
215 . * fix pletvisibility properties:
216 .  * bracket on/off/no-bracket-when-beam
217 .  * num on/off/no-num-when-beam
218 . * fix: standchen.
219 . * junk backlinks?
220 . * junk text{sharp,flat,etc}
221 . * fix convert-mudela manpage
222 . * decimal point in \paper {}
223 . * {  \voiceone <a'4.*2/3  d''4.*2/3 fis''4.*2/3>  [g''8 fis'' e''] d''4 |}
224          and=20
225          { \voicetwo  d'4 d'2.*2/3 } spacing
226 . * tied notes for MIDI
227 . * sharp /flat on trills (in MIDI ??)
228 . * scm-ify \property values.
229 . * move class Lookup {} into scm
230 . * collisions/voices \voiceone \voicetwo are broken; see 
231 . * msgfmt -o check?
232 . * \breathmark TeX macro 
233 . * catch GUILE errors?
234 . * add new glyphs to font.ly
235 . * formatting of input stuff. 
236 . * \notes{ a \< b \cr } vs \notes{ a \< b \! }
237 . * if possible, it might be nice for a warning to appear if someone does
238         \translator with no name and without assigning it to an
239         identifier.  
240 . * space after bars?
241 . * 'hinterfleisch' before bar (e.g. wtk1-fugue2)?
242 . * \type Voice \times 2/3 { [c8 c16 c16 c16 c16] }
243 . * repeat bars: need distance after ":|" and before "|:"
244 . * Summary of minor spelling irregularities:
245 .  *  capitalization/use of underscores in property names
246 .  * fix SkipBars  -> skipBars
247
248 . * broken scripts:
249         lbheel = \script { "bheel" 0 0 -1  0 0 }
250         rbheel = \script { "bheel" 0 0 1 0 0 }
251         lbtoe = \script { "btoe" 0 0 -1 0 0 }
252         rbtoe = \script { "btoe" 0 0 1 0 0 }
253         lfheel = \script { "fheel" 0 0 -1  0 0 }
254         rfheel = \script { "fheel" 0 0 1 0 0 }
255         lftoe = \script { "ftoe" 0 0 -1 0 0 }
256         rftoe = \script { "ftoe" 0 0 1 0 0 }
257         and also
258         portato= \script { "portato" 0 -1 0 1 0 }
259 . * ly2dvi
260 .  * bottomnote for ly2dvi
261 .  * cf'able ly2dvi  tagline.
262 .  * deps for ly2dvi
263 .* STUFF
264 . * check out legal/(c) matters for scores.
265 . * Align_element::padding  ?
266 . * uniformise property names...
267 .  * ydirection <-> yDirection
268 .  * rather allow '_' in identifiers first (i.e. junk ^ and _),
269             and do y_direction?
270 .  * typo checks on property names?
271 . * use streambufs and iostream
272         to provide IO handling for TeX stream, mudela stream, data-file.
273 . * seriously buffer TeX output (do profile of writing .5 mb TeX file.)
274 . * strip EXEs before installing
275 . * zip target for binary windows dist (JBR)
276 . * junking \skip req in lyrics
277 . * Language:
278 .  * \type -> \context ?
279 .  * \translator -> ?
280 .  * fix \partial 
281 .  * \bla {} vs \bla ; 
282 .  * mix engraver hacking with music ?
283 .  * \once\property  KEY = VAL
284 .  * \addtranslator, \removetranslator
285 .  * junk ^ and _ for scripts
286 .  * junk _ for lyrics.
287 .  * abstract grammar.
288 . * percussion note heads
289 . * mi2mu empty staffs.
290 . * horizontal centering of dynamics 
291 . * gzip RH manpage
292 . * stable make/config stuff
293 . * $DEPENDENCIES_OUTPUT support
294 . * Xdvi zooming ?! Try to understand GS garbage collection.
295                 gs: Error: /undefined in draw_beam
296                 gs: Operand stack:
297 . * fix vertical alignment and stafflines
298 . * GrandStaff needs more work -- I want a single word
299         `harpsichord' to the left of the grandstaff, not one on each
300         stave.  (Organ staff -- with separate pedal -- but common
301         properties may be something to think about.  Of course for
302         organ you want to be able to give stop indications on the way
303         through, so the \property Voice.Instrument would be a stop,
304         and \property GrandStaff.instrument would be PipeOrgan...)
305 . * revise the Score_priority_align_engraver concept.  It sucks. 
306 . * make new VoiceOne, VoiceTwo, VoiceThree contexts with
307 ydirection and hshift preset
308 . * *.yo: fix pod manpage layout legacy
309 . * text-items clash with stems/beams
310 . * --include, -I option for ly2dvi (pass on to lily)
311 . * fix placement of beam-less abbrev
312 . * \meter 3/4;
313         <{\voiceone cis4. cis8 cis4 | cis4 cis cis | r1 }
314          {\voicetwo cis,4 r r | r2. | r1 }> |
315         }
316 . * try to use template<Type> iso MACRO(Type)
317 .  * Musical_pitch (analogous to Duration and Rhythmic_req)
318           think about, analogous to pitch: 
319            * { a4 a16 } c <-- duration of c?
320            * < a4 b8 > c <-- duration of c?
321 . * \tempo 4. = 90;
322 . * fix audio-items (don't use (input) requests, but copy data)
323 . * make sure all ex's have a mudela-version
324 . * do rest-collisions for Multi_measure_rests as well.
325 . * split error/warning in error/warning/non_fatal_error
326 . * add a Duration_convert member to Duration_iter to set parameters.
327         Junk global duration settings. 
328 . * minimum length second part broken tie
329 . * en-,discouraged linebreaking: 
330 .  * handle DISALLOW < penalty > FORCE
331 .  * discourage breaking of slurs
332 . * fix variable define/lookup parser global<->paper
333 . * fix title/instrument placements; see input/test/title.ly
334 . * <\voiceone c4. \voicetwo c4>
335 . * add full cello suites to web site (kom op, Maarten!)
336 . * Rethink Time_description
337           * \cadenza , \meter, \grouping should all be \properties
338 . * rename
339 .  * measure -> bar
340 .  * abbrev -> tremolo
341 .  * abbreviation-beam -> (measured/unmeasured) tremolo
342 .  * partial -> anacrouse
343 . * shared lib
344 . * robustify Beam (in case of no stems, 32nd notes)
345 . * decentralised spring factory
346 . * move paper vars into engraver properties
347 . * check for groff / troff/ nroff et
348 . * more intelligent file searching
349 . * make LilyPond RPM fully relocatable
350 . * disable spaces in TeX stuff
351 . * handle ^C for tmp/file creation.
352 . * dots & rest collisions.
353 . * documentation
354 .  * introduction?
355 .  * info?
356 .  * LaTeX?
357 .  * more manpages?
358 . * versioning for Feta
359 . * the warning about the negative slur/tie length appears twice
360         which is irritating.
361 . * The `3' in the meter key is a one or two pixels too thin (at 600dpi)
362         in the middle:
363 . * the bracket is ugly (wings are too parabolic, should be more circular)
364 . * better hshift (dots, distance, head dependent)
365 . * clefs (AG): The "8" should appear closer to the actual clef,
366 touching it.
367 . * put errorlevel in Input class
368 . * junk nesting slurs
369 . * integrate midi-elts from mi2mu and lily?
370 .* 3RD PARTY BUGS
371 . * GNU diff 2.7: diff -rN does not see a new directory with empty file
372 . * check out GCC signatures?
373 . * glibc 2.0:
374           f = fopen ("/dev/null", "r")
375           assert (feof (f))
376 .* 3RD PARTY PROJECTS:
377 . * make GCC warn about ctor that leaves member vars  uninitialised.
378 . * GNU patch 
379 .  * 'double-fix' mode: ignore identical fix, rather than suggest 
380             to revert patch direction when (more or less? exactly) the same 
381             thing is fixed
382 .* PROJECTS
383 . * Scripts:
384 .  * fix position of bar number
385 .  * stack scripts in chords:
386           % fingering:        footing:
387             < a-4 c-2 g-1 >   < c-\ltoe e-\lheel >
388 .  * script-spacing
389 .  * slur parts as a script
390 .  * stack parameterised scripts for fingering and footing:
391
392 . * convert-mudela:
393 .  * automatically add  a \version if not present.
394 .  * better parsing
395 .  * make smarter
396 .  * convert-mudela -e empty.ly
397
398 . * emacs mudela-mode
399 .  *  should handle block comments too.
400 .  *  handle lexer modes (\header, \melodic, \lyric) etc.
401 .  *  indentation
402 .  *  notenames?
403 .  *  fontlock: \melodic \melodic
404
405 . * use properties for:
406 .  * Staff_sym size
407 .  * default tempo.
408 .  * cadenza mode? 
409
410 . * page handling:
411 .  * PS output
412 .  * optimal pagebreaking.
413
414 . * Unicode support? -> man 7 unicode
415 .  * 16 bit Strings
416 .  * -u switch
417 .  * detect of 16/8 bit files
418 .  * examples to go with it.
419
420 . * Spring_spacer:
421 .  * write a faster Spring_spacer (without matrices if possible)
422 .  * relate energybound to linelen unitspace fontsize etc.
423 .  * used fixed point fp?
424
425 . * \header
426 .  * output header info to MIDI too.
427
428 . * a musical dictionary. See Documentation/vocabulary-*, other
429         languages:
430 .  * explanations
431 .  * italian
432 .  * german
433 .  * dutch
434 .  * swedish
435          .. ?
436
437 . * chords
438 .  * guitar chords (fret diagrams)
439 .  * other chord name styles (american(?) style)
440 .  * basso continuo
441 .  * MIDI output?
442
443 . * Debug logs:
444 .  * derive lily_stream, Dstream, texstream from ostream?
445 .  * indentable stream as baseclass for TeX stream, lily stream, Dstream.
446 .  * use dstream feature in mi2mu
447 .  * integrate IO checking into stream class
448
449 . * input converters
450 .  * NIFF?
451 .  * ABC? 
452 .  * SMDL?
453
454 . * add to MIDI output:
455 .  * tempo change
456 .  * ornaments (and trills?)
457 .  * repeat/volta
458 .  * slurs
459 .  * accents
460 .  * dynamics
461 .  * account for rhythmic position in measure
462 .  * etc.
463
464 . * grace notes
465 .  * make separate class for Grace_*_engravers 
466         (which is at Voice_gravs level)
467 .  * make encapsulated spacing problems.
468
469 . * accidentals per Voice_group
470
471 . * Output class, handles : (smallish)
472 .  * help text /(c) notice?
473 .  * version line
474 .  * warning /errors/progress
475 .  * abort on error/warning; exit status
476 .  * quiet/ignore-version options
477 .  * logfile output
478
479 . * PS 
480 .  * speed up PS code.
481 .  * PS lines to .eps files
482 .  * write custom prolog
483
484 .  * NIFF ?
485 .  * Common Music Notation
486 .  * PostScript output (esp. Beams, Slurs, etc)
487 .  * Move all Score_elems, into libmutype.a
488 .  * SGML
489
490 . * Documentation
491 .  * Doc (C) stuff of sheet music
492 .  * a better format?  SGML?  TeX?  Info?
493 .  * a better tutorial
494
495 . * more spanners (smallish)
496 .  * Glissando
497 .  * trill
498
499 . * Rewrite Stem, Beam and Rhythmic_grouping (hairy)
500 .  * [c8. c32 c32]
501 .  * doc on Rhythmic_grouping
502 .  * general shaving on Beam and Stem
503 .  * use plet grouping
504 .  * separate visual from rhythmic info even more
505 .  * beams over bars
506
507 . * lines:
508 .  * Ledger lines, should be separate item: Ledger_lines
509 .  * set different line sizes / thicknesses
510 .  * beam stem showthrough, inter beam sizes (french vs german style)
511
512 . * Collisions
513 .  * left/right note balls should be handled by Collision:
514         < \multi 2; { \stem 1; <b c> } { <f as b> } >
515
516 . * Keys:
517 .  * merge key{item} & localkey{item}?
518 .  * spacing, national styles?
519
520 . * Support for TAB
521 .  * redo Notehead to allow digits as heads
522 .  * add a \tablature {} lexer mode for easy entering
523
524 . * should adjust stemlength for flag number.
525
526 . * breaking:
527 .  * caching breakpoints
528 .  * saving them
529 .  * specify number of lines
530
531 .* INPUTLANGUAGE
532
533 . * c4 4 4 4 for c4 c4 c4 c4?
534 . * <c f a>4 ?
535 . * Viola mode?
536
537                 @c c g e g 
538         for
539                 c g es g, 
540
541                 @A c g e g
542         for
543                 cis gis e gis
544 . * configure pitch_byte
545 . * rest name configurable
546
547
548 .* SMALLISH PROJECTS
549
550 . * fix confusing naming in Engraver vs Engraver_group_engraver (context)
551
552 . * progress when creating MIDI elts.
553
554 . * A range for context errors (eg. mark both { and }. )
555
556 . * lyric in staff  (sharpsharp in staff, text below)
557
558 . * half sharps/flats
559
560 . * write Dynamic_line (to group dynamics horizontally)
561
562 . * use Real for all y positions.
563
564 . * half-sharps, half-flats
565
566 . * adaptive accidental spacing.
567
568 . * handle EOF graciously in error messages.
569
570 . * midi esp.: use I32 iso int where 32 bits are needed (or assumed...)
571
572 . * stafftypes: voice names/ instrument names.
573
574 . * lily \tempo
575
576 . *   % toe to bheel   four to five
577             %   ^_u            4_5  
578             %     -                           
579             %  --|x--         --|x--
580             %  --|---         --|---
581             %  --|---         --|---
582           (where "to" is a tiny bow)
583
584 . * auxilliary file for caching info.
585
586 . * Text_crescendo
587
588 . * clean solution for staffsize in items.
589
590 . * revise calcideal
591
592 .* IDEAS
593 . * Output data structures of Mudela in XML/SGML.
594 . * create libmudela, or liblily_frontend
595 . * move MIDI stuff (including Quantization) to a ANSI C libmidi library.
596 . * Spacing_request for manually adjusting spacing
597 . * caching breakpoints
598 . * used fixedpoint arithmetic for min. energy.
599 . * move towards incremental algorithms.
600 . * versioning stuff (cvt mudela, mudela, etc.)
601 . * dynamic loading of engravers? 
602 .* SMOBS
603 Han-Wen Nienhuys <hanwen@cs.uu.nl> writes:
604
605 > mcmanus@IDT.NET writes:
606 > > > I want different C++ objects (with scheme embedded) to be linked by
607 > > > C++ pointers.  I want to access these other objects from the Scheme
608 > > > code, and I want access to these pointers from C++.
609 > > 
610 > > You can do this with a  combination of smob's and primitive functions,
611 > > though it may not be  be exactly what you wanted.   You would have one
612 > > smob  for each class in  your application, and then  you would write a
613 > > primitive function that would return the objects  that are linked to a
614 > > base object.
615
616 > And the smob and the C++ class are interlinked?  Like
617
618 >       class Foo_class {
619 >               Foo_smob *smob_ptr_;
620 >       }
621
622 >       struct Foo_smob {
623 >               Foo_class *class_ptr_
624 >       }
625
626 Usually you can get away without having this interlinked structure.
627 One piece of information you need when exporting objects to scheme is
628 the smob tag for your class.  You might store this value (a long) into
629 a class static variable, or a file static variable.  I'll use a class
630 static variable in this example.
631
632 I typically use code that works like this (untested code ahead):
633
634 class Foo_class {
635     static long *Foo_smob_tag;
636     SCM obj; // representation as a scheme object, description comes later
637 }
638
639 // call this once on startup
640 void init_Foo_class {
641     static scm_smobfuns type_rec;
642
643     type_rec.mark = foo_mark;
644     type_rec.free = foo_free;
645     type_rec.print = foo_display;
646     type_rec.equalp = 0;
647     Foo_class::Foo_smob_tag = new int(scm_new_smob(type_rec));
648 }
649
650 When you want to export an object to scheme, you put a pointer to the
651 object itself in the cdr of the cell, and the tag in the car of the
652 cell.  The code looks like this:
653
654 // Is this a Foo?
655 static int
656 foo_p(SCM obj)
657 {
658     return(SCM_NIMP(obj) && SCM_CAR(obj) == Foo_class::Foo_smob_tag);
659 }
660
661 // given a Scheme representation, return, a C++ representation
662 static Foo_class *
663 foo_unbox(SCM obj)
664 {
665     return((Foo_class*)SCM_CDR(obj));
666 }
667
668 // the SCM representation of the object is stored inside itself
669 // this will become useful when destructor gets called
670 static SCM
671 foo_box(Foo_class *foo)
672 {
673     SCM_DEFER_INTS;
674     SCM_NEWCELL(foo->obj);
675     SCM_SETCAR(foo->obj, Foo_class::Foo_smob_tag);
676     SCM_SETCDR(foo->obj, (SCM)foo);
677     SCM_ALLOW_INTS;
678     return foo->obj;
679 }
680
681 > C++ determines life time, so what is the strategy?
682
683 What happens now when the destructor gets called?  Lets set the cdr to
684 NULL, and then check for that in all of the primitive functions that
685 use your smob.  We'll call this notion 'live'; a scheme object is
686 'live' if the C++ representation still exists, it's dead if the C++
687 object is gone.  You can still have references to dead objects in
688 scheme code; it's just an error to use them.  This idea is stolen from
689 Emacs's handling of buffers ('buffer-live-p' and friends).
690
691 Add another function, foo_live_p:
692
693 static int
694 foo_live_p(SCM obj)
695 {
696     return(foo_p(obj) && SCM_CDR(obj) != NULL);
697 }
698
699 In you destructor, you need to do:
700
701 ~Foo_class()
702 {
703     SCM_CDR(this->obj, NULL);
704 }
705
706 When writing new primitives, now just check foo_live_p().
707
708 I hope the above helps,
709
710 -russ
711
712
713 --
714 "Even if you are on the right track, you'll get run over 
715 if you just sit there."  
716              --Will Rogers (1879-1935)
717
718 * OUTLINE SETUP
719 .* .EMACS
720 ;;; from outline.el
721 (defvar outline-font-lock-keywords
722   '(;; Highlight headings according to the level.
723     ;; must change this to allout node layout
724     ;;("^\\(\\*+\\)[ \t]*\\(.+\\)?[ \t]*$"
725     ("^\\([.]*[ ]*[*]\\)[ \t]*\\(.*\\)$"
726      (1 font-lock-string-face)
727      (2 (let ((len (- (match-end 1) (match-beginning 1))))
728           (or (cdr (assq len '((1 . font-lock-function-name-face)
729                                (2 . font-lock-keyword-face)
730                                (3 . font-lock-comment-face))))
731               font-lock-variable-name-face))
732         nil t))
733     ;; Highlight citations of the form [1] and [Mar94].
734     ("\\[\\([A-Z][A-Za-z]+\\)*[0-9]+\\]" . font-lock-type-face))
735   "Additional expressions to highlight in Outline mode.")
736
737 (add-hook 'outline-mode-hook
738           '(lambda ()
739             (setq font-lock-maximum-decoration t)
740             (setq font-lock-maximum-decoration t)
741             (make-local-variable 'font-lock-defaults)
742             (setq font-lock-defaults '(outline-font-lock-keywords t))
743             (font-lock-mode global-font-lock-mode)
744         ))
745  
746 (require 'allout)
747 (outline-init 't)