[asdf-devel] [cclan-list] How to depend on a system optionally?

Robert Goldman rpgoldman at sift.info
Mon Jul 20 22:35:35 UTC 2009


james anderson wrote:
> 
> On 2009-07-20, at 21:10 , Robert Goldman wrote:
> 
>> james anderson wrote:
>>> On 2009-05-18, at 14:55 , Nikodemus Siivola wrote:
>>>
>>>> 2009/5/18 Robert Goldman <rpgoldman at sift.info>:
>>>>> Tobias C. Rittweiler wrote:
>>>>>> I've read several times that it's a head ache to configure optional
>>>>>> dependencies with ASDF.
>>>>>>
>>>>>> How true is that? Could we perhaps provide another clause
>>>>>> :OPTIONALLY-DEPEND-ON in DEFSYSTEM which would load a system only if
>>>>>> available?
>>>> Doesn't :WEAKLY-DEPENDS-ON do what you want?
>>>
>>> there is at least one more kind of dependency between two components:
>>> "contingency".
>>
>> ...
>>
>> Did this discussion ever go anywhere?
>>
>> James, would it be possible for you to resend this email with the tables
>> given as a text attachment, rather than as inline text?  I don't know
>> about the rest of the list, but my client (Thunderbird) turned your
>> tables into complete and utter gibberish.
> 
> [i suspect it was because i neglected to disable line-wrapping before i
> sent the message.]
> 
> to summarize:
> 
> in addition to simple and weak dependency, there is at least one more
> kind of dependency between two components: "contingency".
> 
> in order to manage a system for multiple runtimes, each of which
> entails it's own foreign libraries, i have found it useful to add a
> constraint called "contingent-on". this may-or-may-not be what you
> intend with "optionally-depend-on". i have found it useful to express
> the constraints:
> 
>   "if a feature|system 'X' is present, then system|component 'Y' is
> required, and depends on 'X'. if 'X' is not present, do nothing."
> 
> i attach an html file which describes, as a table, the relation between
> system model state and operations.

I suppose you could kludge this into place, in much the way
weakly-depends-on was kludged.  Just check the dependency eagerly (at
read time), and if the contingency isn't satisfied, prune the component.

Note that I have an icky feeling about both of these extensions to ASDF.
 At the system level, they behave reasonably, but at the module or file
level, I think they have weird semantics.  What would it mean, for
example, to be :contingent-on or :weakly-depend on a :file?
Unfortunately, :weakly-depend-on can be parsed off an arbitrary
component, not just a system.  Oh.  Looking at the source, I see that
weakly-depends on only works on a system name.  This means that

(defsystem foobar
  :weakly-depends-on ((feature "foo"))

is not permitted, which seems wrong.  That is, it seems wrong until you
realize that the feature would be interpreted at the time the defsystem
form is READ, not at the time you try to operate on the system.

The more I think about this, the more queasy it makes me feel...
> 
> 
> ------------------------------------------------------------------------
> 
> ------------------------------------------------------------------------
> 
> simple dependency intends this behaviour:
> 	component status	effect
> expression	component a	component/feature b
> a (:depends-on (:b))	present	present	(operate b), (operate a)
> a (:depends-on (:b))	present	absent	error
> a (:depends-on (:b))	absent	present	error
> a (:depends-on (:b))	absent	absent	error
> 
> ------------------------------------------------------------------------
> 
> given the code in parse-component-form, :weakly-depends-on would appear
> to effect this behaviour:
> 	component status	effect
> expression	component a	component/feature b
> a (:weakly-depends-on (:b))	present	present	(operate b), (operate a)
> a (:weakly-depends-on (:b))	present	absent	(operate a)
> a (:weakly-depends-on (:b))	absent	present	error
> a (:weakly-depends-on (:b))	absent	absent	error
> 
> ------------------------------------------------------------------------
> 
> there are cases, where it is useful to cause a third behaviour:
> 	component status	effect
> expression	component a	component/feature b
> a (:contingent-on (:b))	present	present	(operate b), (operate a)
> a (:contingent-on (:b))	present	absent
> a (:contingent-on (:b))	absent	present	error
> a (:contingent-on (:b))	absent	absent	error
> 
> ------------------------------------------------------------------------
> 
> perhaps there are others. this one is useful when building a system
> where the components are contingent on the runtime and/or o/s.
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> asdf-devel mailing list
> asdf-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/asdf-devel





More information about the asdf-devel mailing list