3 relatively easy workarounds,
1. don't reference x or y in modifiers. (ie make them output a tacit
expression)
instead of say: 1 : 'u@:libverb y', do 1 : ' u@:libverb'
2. rewrite as verb,
If it really takes/needs another external verb input, then use a gerund left
argument. The ti utility below allows you to "seemlessly" join verbs and
(nouns or verbs) into a gerund.
ar_z_=: 1 : '5!:1 <''u'''
isNoun_z_ =: (0 = 4!:0 ::0:)@:<isgerund_z_ =: 0:`(0 -.@e. 3 : ('y
(5!:0)';'1')"0)@.(0 < L.) :: 0:
isgerundA_z_ =: 1 : ' if. isNoun ''u'' do. isgerund m else. 0 end.'
ti_z_
2 : 0
if. -. u isgerundA do. u =. u ar end.
if. -. v isgerundA do. v =. v ar end.
u,v
)
whatwasmyadverb_lib_ =: 4 : ' ''`x f'' =. x label_. x f@:verbinlib y'
call as
x ti u whatwasmyadverb y
can also bind as
(ti u)(&whatwasmyadverb)
3. locate "members"
this will work with instanced locales (objects)
loc_z_=: (,&'_'@[ ,&'_'@, ":@>@])"1 0 boxopen
locs_z_ =: 1:: m loc 18!:5 ''
myadverb_lib_ =: 1 : ' u@:(''verbinlib'' locs) y ' NB. will fix to numbered
locale or string locale.
________________________________
From: Xiao-Yong Jin <[email protected]>
To: [email protected]
Sent: Friday, March 31, 2017 1:06 PM
Subject: Re: [Jprogramming] locales with adverbs and conjunctions?
I don't see how this would help. In concrete terms, I want the following
public stable interface of a library SomeLib,
cocurrent'SomeLib'
libAdvb=:1 :'...'
libVerb=:3 :'...'
they refer to each other and a list of other names in SomeLib that should
remain isolated as hidden implementation details that could change later.
Now in a separate application,
cocurrent'SomeApp'
appVerb=:3 :0
...
libVerb_SomeLib_ appNoun NB. This is OK.
otherAppVerb libAdvbInSomeLib otherAppNoun NB. ???
...
)
How would I write libAdvbInSomeLib to actually use libAdvb_SomeLib_, which
can depend on all the names defined in SomeLib?
The wiki link Henry sent told me to define a new verb in SomeLib, but that
is undesirable. The newVerb_SomeLib_ defined in SomeApp pollutes the
namespace in SomeLib and could clash with existing names. I wouldn't want
SomeApp to touch the namespace of SomeLib.
The following seems to work, but I wish for a simpler solution.
h_t_=:1 : 0 NB. the helper for a_t_
echo'h_t_ in ',>coname''
ff_t_=.u a_t_ NB. ff_t_ actually becomes public in t
ff_t_ y
)
a_t_=:1 : 0 NB. can be a lot more involved definition
echo 'a_t_ in ',>coname''
u f y
)
f_t_=:3 : 0 NB. some verb in t
echo 'f_t_ in ',>coname''
y
)
f=:3 : 0 NB. some verb outside of t
echo'f in ',>coname''
y
)
a=:3
f_base_ h_t_ a NB. need to fully qualify the locale of f, but not a
aa_t_ in base
a_t_ in t
f_t_ in t
f in base
3
f h_t_ a NB. otherwise f_t_ is actually used
aa_t_ in base
a_t_ in t
f_t_ in t
f_t_ in t
3
ff h_t_ a NB. STACK ERROR for fun
> On Mar 31, 2017, at 10:39 AM, Raul Miller <[email protected]> wrote:
>
> There are certainly ways to work around this issue. It's just a minor
> matter of coding them up.
>
> The important thing here is that adverb evaluation and verb evaluation
> are two different things, and when your adverb is named in a locale
> you need to capture the identity of that locale before creating the
> verb if you want the verb to execute within that locale.
>
> Here's an approach that might work for you:
>
> advA_example_=:1 :0
> locale=. coname''
> u helperA locale
> )
>
> helperA_example_=:2 :0
> u__v y
> )
>
> Note also that if you don't like having a named helper, and if it's
> small enough, you could put it in line:
>
> advB_example_=:1 :0
> locale=. coname''
> u 2 :'u__v y' locale
> )
>
> I haven't actually tested this, but I think I got this right - but let
> me know if it doesn't work for you.
>
> Thanks,
>
> --
> Raul
>
>
> On Fri, Mar 31, 2017 at 11:15 AM, Xiao-Yong Jin <[email protected]> wrote:
>> This is less useful. The simplest case that I use locale for is writing
>> a_z_=:a_t_
>> with a_t_ an explicit definition that uses all the things defined in locale
>> 't'.
>> I could do it, had 'a' been a verb.
>> With 'a' an adverb or conjunction, I have to suffix all names in 'a_t_' with
>> '_t_',
>> and as you mentioned this is less desirable as I can't override those
>> definitions with
>> the locale path any more.
>>
>> Is there any other way to work around it?
>>
>> I guess I can always do
>> coinsert't'
>> but that leaves open the possibility of name collisions and removes benefits
>> of locales.
>>
>>> On Mar 31, 2017, at 8:40 AM, 'Pascal Jasmin' via Programming
>>> <[email protected]> wrote:
>>>
>>> "The rule" is that "Semi tacit" modifiers can implicitly access members of
>>> their own locale. Explicit modifiers cannot. The reason why.
>>>
>>> +: 1 : 'u' NB. semi tacit: processes entirely in locale and returns tacit
>>> expression (then vanishes)
>>>
>>> +:
>>>
>>> +: 1 : ' u y' NB. explicit. returns bound explicit expression that executes
>>> in some unknown locale.
>>> +: (1 : ' u y')
>>>
>>>
>>> You can also explicitly label the locales used in an explicit modifier.
>>>
>>> 1 : ' u aa_t_ y'
>>>
>>> will work from any locale. Though may not be appropriate when you make
>>> "object instances" and need to have the reference move with the instance.
>>>
>>>
>>>
>>>
>>> ________________________________
>>> From: roger stokes <[email protected]>
>>> To: [email protected]
>>> Sent: Friday, March 31, 2017 4:37 AM
>>> Subject: Re: [Jprogramming] locales with adverbs and conjunctions?
>>>
>>>
>>>
>>> If you want +: a_t_ 3 to give a result of 6 then you need to write:
>>>
>>> a_t_ =: 1 : 'u aa'
>>> aa_t_ =: 1 : 'u'
>>>
>>> +: a_t_ 3
>>> 6
>>>
>>>
>>> On Fri, Mar 31, 2017 at 5:08 AM, Xiao-Yong Jin <[email protected]>
>>> wrote:
>>>
>>>> Does locale change only happens with verbs?
>>>>
>>>> v_t_=:3 :'vv y'
>>>> vv_t_=:3 :'+: y'
>>>> v_t_ 3
>>>> 6
>>>> a_t_=:1 :'u aa y'
>>>> aa_t_=:1 :'u y'
>>>> +: a_t_ 3
>>>> |value error: aa
>>>> | u aa y
>>>> c_t_=:2 :'u cc v y'
>>>> cc_t_=:2 :'u v y'
>>>> +: c_t_ *: 3
>>>> |value error: cc
>>>> | u cc v y
>>>>
>>>> This seems to be very inconvenient.
>>>> ----------------------------------------------------------------------
>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm