shorter:

sfork=:(1 : '(4 0 1 5 6 2 3) C. (;: ''@[ @]'') , (1{:: 0{:: u`[)') 1 : 'u`:6'
3 4 (+: + -:) sfork 2 4

Here's a version that will check to see if the tines are in a list of
monads (proof of concept)

buildTrain is a mess to look at

NB. creates and documents a function
NB. could be improved to split out example
NB. or automatically assert on the example
NB. originally from
http://www.jsoftware.com/pipermail/programming/2014-July/038316.html
func=: 3 : 0
doc=.(y,'_doc')=: 0 : 0
lines=.dlb each LF cut doc
0!:0 > {: lines
examples=.(y,'_examples')=:3 }. each (#~ (<'ex:') E. 3 {. each [) lines
for_ex. examples do.
    ex=.(>ex)
    try.
        assert ". ex
    catch.
        smoutput ex , ' failed'
        smoutput 'returned '
        smoutput ". ex
    end.

end.
''
)


monads=: ;: '+: -:'
func 'buildTrain'
   adds @[ to the left tine if it's a monad and @] to the right if its a monad
   ex: (;: '+: @ [ + -: @ ]') -: ((1 0 1) buildTrain (;: '+: + -:'))
   ex: (;: '* + -: @ ]') -: ((0 0 1) buildTrain (;: '* + -:'))
   ex: (;: '* + *') -: ((0 0 0) buildTrain (;: '* + *'))
   buildTrain=: (([(((<,'@'),(<,'[')),~])^:(0&{::@[)0&{@]) , (1&{@]) ,
([(((<,'@'),(<,']')),~])^:(2&{::@[)2&{@]))
)

func 'sfork'
   ex: (16,24) -:(2 4 (+ + +) sfork 6 8) NB. (2+6+2+6) , (4+8+4+8)
   ex: (12,20) -:(2 4 (+: + +) sfork 6 8) NB. ((2*2)+2+6) , ((4*2)+4+8)
   ex: (16,24) -:(2 4 (+: + +:) sfork 6 8) NB. ((2*2)+(6*2)) , ((4*2)+(8*2))
   sfork=: (1 : '(] buildTrain~ (e.&monads)) (1{:: 0{:: u`[)') (1 : 'u`:6')
)


On Thu, Dec 10, 2015 at 1:58 PM, Joe Bogner <joebog...@gmail.com> wrote:
> Oh, that is clever but not too mysterious. I also went down the path
> of trying to get the linear representation of u but got stuck because
> 5!:5 expects a name. I didn't think to assign a local name.
>
> This was also cool and the piece I was missing to gerundify u
>
> (+: + -:) (1 : '0{:: u`[')
> ┌─┬─────────┐
> │3│┌──┬─┬──┐│
> │ ││+:│+│-:││
> │ │└──┴─┴──┘│
> └─┴─────────┘
>
>
>
> Thanks
>
> On Thu, Dec 10, 2015 at 1:35 PM, Raul Miller <rauldmil...@gmail.com> wrote:
>> Here's a draft implementation of what I think you mean by a "smart fork":
>>
>> NB. draft
>> sfork=:1 :0
>>   impl=. 0 {:: u`-
>>   if. (<,'3')-:{.impl do.
>>     d=. 5!:1@<
>>     e=. 5!:0
>>     '`a b c'=. 1 {:: impl
>>     (d'a')e@[ (d'b')e (d'c')e@]
>>   end.
>> )
>>
>> Example use:
>>    (+-*)sfork
>> +@[ - *@]
>>
>> Hopefully that's not too mysterious?
>>
>> Basically, it's taking the gerund of its argument (which it assumes is
>> a verb or an atomic representation of a verb), and if that represents
>> a fork, it's extracting the three verbs from the fork and slapping a
>> @[ on the left tine and a @] on the right tine.
>>
>> Anyways, I've occasionally also itched for something like this. But
>> the definition is big enough that I never bother.
>>
>> Thanks,
>>
>> --
>> Raul
>>
>>
>> On Thu, Dec 10, 2015 at 1:15 PM, Joe Bogner <joebog...@gmail.com> wrote:
>>> Interesting. I'm not sure if M is worth it over @] due to potential
>>> naming conflicts and ambiguity in the code .@] is very clear
>>>
>>> It got me thinking that it might be interesting (albeit probably not
>>> overly useful) to have a 'smart fork' adverb that could figure out
>>> that its arguments are monadic and bind them appropriately
>>>
>>> This starts to show what I mean
>>> fork=:(2 : 'u@[ + v@]')
>>>
>>> 3 4 (+: fork -:) 2 4
>>> 7 10
>>>
>>> The + would need to be extracted, so it would need to be
>>>
>>> 3 4 (+: + -:) fork 2 4
>>>
>>> I don't think that's possible without using gerunds..
>>>
>>> fork=: (1 :'(0{:: u);''@'';''['';(1&{::u);(2{:: u);''@'';'']''') (1 : 'u 
>>> `:6')
>>>
>>> +:`+`-: fork
>>> +:@[ + -:@]
>>>
>>> 3 4 +:`+`-: fork 2 4
>>> 7 10
>>>
>>> fork could be enhanced to detect whether the tines are monadic and
>>> only apply the @[ and @] if so
>>>
>>> not sure how useful it is, but fun to play with
>>>
>>>
>>>
>>>
>>> On Thu, Dec 10, 2015 at 12:11 PM, 'Pascal Jasmin' via Programming
>>> <programm...@jsoftware.com> wrote:
>>>> Here is another approach to simplifying J and meeting dyadic J goals 
>>>> without verb definitions:
>>>>
>>>> M =: @]
>>>>
>>>>
>>>>      3 4 (+:M~ + -:M) 2 4
>>>> 7 10
>>>>   (+: M~ + -: M) 2 4
>>>> 5 10
>>>>
>>>>
>>>>
>>>> ~ (swap) basically works like @[ on a monad that is defined to ignore x 
>>>> rather than return error.
>>>>
>>>> M or M~ is easier to type than @:] or @:[ too.
>>>>
>>>>
>>>> T =: &{(>@)
>>>> NB. double adverb version of @:
>>>> at =: 1 : 'u  1 :''2 : ''''u (v@:) '''' u'''
>>>>
>>>>
>>>>
>>>>
>>>>   3 2 (1 T M~ +     0 1 T M +: at) 2 3 4
>>>> 6 8
>>>>
>>>> ----- Original Message -----
>>>> From: Jose Mario Quintana <jose.mario.quint...@gmail.com>
>>>> To: Programming forum <programm...@jsoftware.com>
>>>> Sent: Thursday, December 3, 2015 11:04 AM
>>>> Subject: Re: [Jprogramming] dyadic J
>>>>
>>>> Pascal wrote:
>>>>
>>>> "There is a addon called general/primitives that provides shadow names for
>>>> everything."
>>>>
>>>> However, trying to provide a shadow name for $: is futile.
>>>>
>>>>
>>>> Pascal wrote:
>>>>
>>>> 'A recent point of conversion of mine is that u@:v is both easier to read
>>>> and edit/expand and easier to see subresults by cutting out parts of an @
>>>> train "s@t@u@v" even if its u@:(v) compared to [: u v.'
>>>>
>>>> Welcome to a very exclusive club ;)
>>>>
>>>>
>>>> Linda wrote:
>>>> "
>>>> Pascal and others. I am curious to know if you find tacit code easy to 
>>>> read.
>>>>
>>>> cr=:([ = [: +/ [: |: #~ #: [: i. ^) #"2 #~ #: [: i. ^
>>>> divy=:([: ,. [: <"1 '*' $~ ] ,~ [: <. %) , [: < '*' $~ [ - ] * [: <. %
>>>>
>>>> Those two tacit lines seem hard to translate for me. Instead I find the
>>>> expressions below are quite easy to follow.
>>>>
>>>>    cr=: 13 :'(x= +/ |:(y#x)#:i.x^y) #"2 (y#x)#:i.x^y'
>>>>    divy=: 13 :'(,.<"1((<.x%y),y)$''*''),<(x-y*<.x%y)$''*'''
>>>> "
>>>>
>>>> I submit that it is a matter of familiarity.  Granted, forum members are
>>>> likely more familiar with explicit rather than tacit reading and writing
>>>> (then again, most programmers are more familiar with one element at a time
>>>> as opposed to array processing).
>>>>
>>>> Personally, armed with the boxed representation of a verb, I can typically
>>>> see effortlessly how the data flows given a tacit verb and its
>>>> argument(s).  This does not surprise me since the interpreter’s
>>>> representation of a verb is closely related to the boxed representation (if
>>>> I recall correctly).
>>>>
>>>> Moreover, tacit forms facilitate the manual, or automatic, symbolic
>>>> manipulation and simplification of tacit forms.  For example,
>>>>
>>>>    cr=:([ = [: +/ [: |: #~ #: [: i. ^) #"2 #~ #: [: i. ^
>>>>
>>>>    cr
>>>> ([ = [: +/ [: |: #~ #: [: i. ^) #"2 #~ #: [: i. ^
>>>> ┌─────────────────────────────────────────────┬───────┬────────────────────┐
>>>> │┌─┬─┬───────────────────────────────────────┐│┌─┬─┬─┐│┌─────┬──┬─────────┐│
>>>> ││[│=│┌──┬─────┬────────────────────────────┐│││#│"│2│││┌─┬─┐│#:│┌──┬──┬─┐││
>>>> ││ │ ││[:│┌─┬─┐│┌──┬──┬────────────────────┐│││└─┴─┴─┘│││#│~││  
>>>> ││[:│i.│^│││
>>>> ││ │ ││  ││+│/│││[:│|:│┌─────┬──┬─────────┐││││       ││└─┴─┘│  
>>>> │└──┴──┴─┘││
>>>> ││ │ ││  │└─┴─┘││  │  ││┌─┬─┐│#:│┌──┬──┬─┐│││││       
>>>> │└─────┴──┴─────────┘│
>>>> ││ │ ││  │     ││  │  │││#│~││  ││[:│i.│^││││││       │                    
>>>> │
>>>> ││ │ ││  │     ││  │  ││└─┴─┘│  │└──┴──┴─┘│││││       │                    
>>>> │
>>>> ││ │ ││  │     ││  │  │└─────┴──┴─────────┘││││       │                    
>>>> │
>>>> ││ │ ││  │     │└──┴──┴────────────────────┘│││       │                    
>>>> │
>>>> ││ │ │└──┴─────┴────────────────────────────┘││       │                    
>>>> │
>>>> │└─┴─┴───────────────────────────────────────┘│       │                    
>>>> │
>>>> └─────────────────────────────────────────────┴───────┴────────────────────┘
>>>>
>>>>    NB. Regardless of the nature of the arguments...
>>>>
>>>>    NB. Automatically,
>>>>
>>>>    cr f. decap ala  NB. Wicked Jx adverbs for decapitating and associating
>>>> @:s to the left
>>>> ([ = +/@:|:@:(#~ #: i.@:^)) #"2 #~ #: i.@:^
>>>> ┌─────────────────────────────────────────────┬───────┬────────────────────┐
>>>> │┌─┬─┬───────────────────────────────────────┐│┌─┬─┬─┐│┌─────┬──┬─────────┐│
>>>> ││[│=│┌─────────────┬──┬────────────────────┐│││#│"│2│││┌─┬─┐│#:│┌──┬──┬─┐││
>>>> ││ │ ││┌─────┬──┬──┐│@:│┌─────┬──┬─────────┐│││└─┴─┴─┘│││#│~││  
>>>> ││i.│@:│^│││
>>>> ││ │ │││┌─┬─┐│@:│|:││  ││┌─┬─┐│#:│┌──┬──┬─┐││││       ││└─┴─┘│  
>>>> │└──┴──┴─┘││
>>>> ││ │ ││││+│/││  │  ││  │││#│~││  ││i.│@:│^│││││       
>>>> │└─────┴──┴─────────┘│
>>>> ││ │ │││└─┴─┘│  │  ││  ││└─┴─┘│  │└──┴──┴─┘││││       │                    
>>>> │
>>>> ││ │ ││└─────┴──┴──┘│  │└─────┴──┴─────────┘│││       │                    
>>>> │
>>>> ││ │ │└─────────────┴──┴────────────────────┘││       │                    
>>>> │
>>>> │└─┴─┴───────────────────────────────────────┘│       │                    
>>>> │
>>>> └─────────────────────────────────────────────┴───────┴────────────────────┘
>>>>
>>>>    NB. Manually,
>>>>
>>>>    [ (([ = +/@:|:@:]) #"2 ]) #~ #: i.@:^  NB. Distributing (#~ #: i.@:^)
>>>> [ (([ = +/@:|:@:]) #"2 ]) #~ #: i.@:^
>>>> ┌─┬──────────────────────────────────────┬────────────────────┐
>>>> │[│┌──────────────────────────┬───────┬─┐│┌─────┬──┬─────────┐│
>>>> │ ││┌─┬─┬────────────────────┐│┌─┬─┬─┐│]│││┌─┬─┐│#:│┌──┬──┬─┐││
>>>> │ │││[│=│┌─────────────┬──┬─┐│││#│"│2││ ││││#│~││  ││i.│@:│^│││
>>>> │ │││ │ ││┌─────┬──┬──┐│@:│]│││└─┴─┴─┘│ │││└─┴─┘│  │└──┴──┴─┘││
>>>> │ │││ │ │││┌─┬─┐│@:│|:││  │ │││       │ ││└─────┴──┴─────────┘│
>>>> │ │││ │ ││││+│/││  │  ││  │ │││       │ ││                    │
>>>> │ │││ │ │││└─┴─┘│  │  ││  │ │││       │ ││                    │
>>>> │ │││ │ ││└─────┴──┴──┘│  │ │││       │ ││                    │
>>>> │ │││ │ │└─────────────┴──┴─┘││       │ ││                    │
>>>> │ ││└─┴─┴────────────────────┘│       │ ││                    │
>>>> │ │└──────────────────────────┴───────┴─┘│                    │
>>>> └─┴──────────────────────────────────────┴────────────────────┘
>>>>
>>>>    [ ((  = +/@:|:   ) #"2 ]) #~ #: i.@:^  NB. Hook form
>>>> [ ((= +/@:|:) #"2 ]) #~ #: i.@:^
>>>> ┌─┬─────────────────────────────┬────────────────────┐
>>>> │[│┌─────────────────┬───────┬─┐│┌─────┬──┬─────────┐│
>>>> │ ││┌─┬─────────────┐│┌─┬─┬─┐│]│││┌─┬─┐│#:│┌──┬──┬─┐││
>>>> │ │││=│┌─────┬──┬──┐│││#│"│2││ ││││#│~││  ││i.│@:│^│││
>>>> │ │││ ││┌─┬─┐│@:│|:│││└─┴─┴─┘│ │││└─┴─┘│  │└──┴──┴─┘││
>>>> │ │││ │││+│/││  │  │││       │ ││└─────┴──┴─────────┘│
>>>> │ │││ ││└─┴─┘│  │  │││       │ ││                    │
>>>> │ │││ │└─────┴──┴──┘││       │ ││                    │
>>>> │ ││└─┴─────────────┘│       │ ││                    │
>>>> │ │└─────────────────┴───────┴─┘│                    │
>>>> └─┴─────────────────────────────┴────────────────────┘
>>>>
>>>>    NB. Given the nature of the arguments...
>>>>
>>>>    [ ((  = +/@:|:   ) #   ]) #~ #: i.@:^  NB. Redundant "2
>>>> [ ((= +/@:|:) # ]) #~ #: i.@:^
>>>> ┌─┬───────────────────────┬────────────────────┐
>>>> │[│┌─────────────────┬─┬─┐│┌─────┬──┬─────────┐│
>>>> │ ││┌─┬─────────────┐│#│]│││┌─┬─┐│#:│┌──┬──┬─┐││
>>>> │ │││=│┌─────┬──┬──┐││ │ ││││#│~││  ││i.│@:│^│││
>>>> │ │││ ││┌─┬─┐│@:│|:│││ │ │││└─┴─┘│  │└──┴──┴─┘││
>>>> │ │││ │││+│/││  │  │││ │ ││└─────┴──┴─────────┘│
>>>> │ │││ ││└─┴─┘│  │  │││ │ ││                    │
>>>> │ │││ │└─────┴──┴──┘││ │ ││                    │
>>>> │ ││└─┴─────────────┘│ │ ││                    │
>>>> │ │└─────────────────┴─┴─┘│                    │
>>>> └─┴───────────────────────┴────────────────────┘
>>>>
>>>>    [ ((  = +/"1     ) #   ]) #~ #: i.@:^  NB. Summing the rows of a matrix
>>>> [ ((= +/"1) # ]) #~ #: i.@:^
>>>> ┌─┬─────────────────────┬────────────────────┐
>>>> │[│┌───────────────┬─┬─┐│┌─────┬──┬─────────┐│
>>>> │ ││┌─┬───────────┐│#│]│││┌─┬─┐│#:│┌──┬──┬─┐││
>>>> │ │││=│┌─────┬─┬─┐││ │ ││││#│~││  ││i.│@:│^│││
>>>> │ │││ ││┌─┬─┐│"│1│││ │ │││└─┴─┘│  │└──┴──┴─┘││
>>>> │ │││ │││+│/││ │ │││ │ ││└─────┴──┴─────────┘│
>>>> │ │││ ││└─┴─┘│ │ │││ │ ││                    │
>>>> │ │││ │└─────┴─┴─┘││ │ ││                    │
>>>> │ ││└─┴───────────┘│ │ ││                    │
>>>> │ │└───────────────┴─┴─┘│                    │
>>>> └─┴─────────────────────┴────────────────────┘
>>>>
>>>> This latter form is the capless counterpart of the version provided by
>>>> Lippu Esa.
>>>>
>>>>
>>>>
>>>>
>>>> On Sat, Nov 28, 2015 at 2:27 AM, Linda A Alvord <lindaalv...@verizon.net>
>>>> wrote:
>>>>
>>>>> Pascal and others. I am curious to know if you find tacit code easy to
>>>>> read.
>>>>>
>>>>> cr=:([ = [: +/ [: |: #~ #: [: i. ^) #"2 #~ #: [: i. ^
>>>>> divy=:([: ,. [: <"1 '*' $~ ] ,~ [: <. %) , [: < '*' $~ [ - ] * [: <. %
>>>>>
>>>>> Those two tacit lines seem hard to translate for me. Instead I find the
>>>>> expressions below are quite easy to follow.
>>>>>
>>>>>    cr=: 13 :'(x= +/ |:(y#x)#:i.x^y) #"2 (y#x)#:i.x^y'
>>>>>    divy=: 13 :'(,.<"1((<.x%y),y)$''*''),<(x-y*<.x%y)$''*'''
>>>>>
>>>>> In most cases, with examples there is little documentation that is
>>>>> necessary.
>>>>>
>>>>> 2 cr 5
>>>>> 0 0 0 1 1
>>>>> 0 0 1 0 1
>>>>> 0 0 1 1 0
>>>>> 0 1 0 0 1
>>>>> 0 1 0 1 0
>>>>> 0 1 1 0 0
>>>>> 1 0 0 0 1
>>>>> 1 0 0 1 0
>>>>> 1 0 1 0 0
>>>>> 1 1 0 0 0
>>>>> 18 divy 5
>>>>> ------┐
>>>>> │*****│
>>>>> +-----+
>>>>> │*****│
>>>>> +-----+
>>>>> │*****│
>>>>> +-----+
>>>>> │***  │
>>>>> L------
>>>>> Maybe it is just that the explicit code looks like mathematics. It might 
>>>>> be
>>>>> interesting and useful to hear how programmers and J users read code most
>>>>> easily.
>>>>>
>>>>> Linda
>>>>> -----Original Message-----
>>>>> From: programming-boun...@forums.jsoftware.com
>>>>> [mailto:programming-boun...@forums.jsoftware.com] On Behalf Of Don Kelly
>>>>> Sent: Friday, November 27, 2015 10:37 PM
>>>>> To: programm...@jsoftware.com
>>>>> Subject: Re: [Jprogramming] dyadic J
>>>>>
>>>>> there is nothing wrong with saying something like plus =: + conjugate =:+
>>>>> and knowing that  plus is intended to be monadic (although  +(real
>>>>> number) is the real number in either case.  If you want one to work as
>>>>> monadic onlyand the other as dyadic only-then you have to dress them up a
>>>>> bit with some test and error message.
>>>>> you can do  mean=:  sum divideby count  in any language.
>>>>> J has 2 meanings for +  -which are dependent on the context. English also
>>>>> is
>>>>> like that in that some words have two unrelated meanings (e.g bow , can,
>>>>> twig, butt ) as well as having some with related meanings (e.g rise, 
>>>>> level)
>>>>> and a lot of other things that depend on context It would be possible to
>>>>> build up a long list of names so that all uses of the primitives have
>>>>> different names and do just what the names indicate but is that of any 
>>>>> more
>>>>> than limited  use?
>>>>>
>>>>>
>>>>>
>>>>> On 11/27/2015 1:08 PM, 'Pascal Jasmin' via Programming wrote:
>>>>> > Are you saying that if I define
>>>>> >
>>>>> > floor =: (<. : (<.@]))"0 _ 0
>>>>> >
>>>>> > that it does not have integrated rank support?
>>>>> >
>>>>> > The criticism about english and documentation seems hollow to me.  I
>>>>> don't
>>>>> say that Nuvoc is useless because it hasn't been implemented in 150
>>>>> languages.  An ability to read the dictionary in English is essential to
>>>>> learn J, and code typically uses english shaddows from profile.ijs.  
>>>>> Making
>>>>> foreign language cover verbs including autotranslating the english ones is
>>>>> straightforward, and answers that part of the criticism.  Using the exact
>>>>> names from the dictionary (what I'm refering to as autodocumentation
>>>>> because
>>>>> the exact same place you would look up i. is where iota will be 
>>>>> explained.)
>>>>> seems like an elegant way to ease a shallow learning curve on the process.
>>>>> >
>>>>> > The entire criticism could be applied to "you should never assign a verb
>>>>> to any name"
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> > ----- Original Message -----
>>>>> > From: Raul Miller <rauldmil...@gmail.com>
>>>>> > To: Programming forum <programm...@jsoftware.com>
>>>>> > Sent: Friday, November 27, 2015 3:27 PM
>>>>> > Subject: Re: [Jprogramming] dyadic J
>>>>> >
>>>>> > On Thu, Nov 26, 2015 at 4:12 PM, 'Pascal Jasmin' via Programming
>>>>> > <programm...@jsoftware.com> wrote:
>>>>> >> The only disadvantage I recognize is the point about special code.
>>>>> > It would be interesting to go over the reasons you do not recognize
>>>>> > the other disadvantages.
>>>>> >
>>>>> >> As to your other points, because the primitives are tacit, I believe
>>>>> there is integrated rank support.
>>>>> >>
>>>>> >>    floor b. 0
>>>>> >> 0 _ _
>>>>> > You might want to read
>>>>> > http://www.jsoftware.com/pipermail/general/1998-October/000041.html
>>>>> >
>>>>> > All verbs have rank support, even verbs which contain explicit
>>>>> > definitions. However, for some combinations of primitives, the
>>>>> > interpreter takes special steps - bypassing the default implementation
>>>>> > of rank support with something more efficient.
>>>>> >
>>>>> >> English is needed to read dictionary, and all of the primitives are the
>>>>> monad dictionary entries, so everything is autodocumented.
>>>>> > In my experience, documentation is difficult and autodocumentation
>>>>> > quickly falls victim to entropy. It sounds great, but most examples I
>>>>> > have seen become incredibly useless in practice. It's possible to work
>>>>> > around this with manual effort, but the effort involved often seems to
>>>>> > be greater than the effort of simply doing it manually in the first
>>>>> > place. Where automation shines is replicating the useful manual
>>>>> > efforts.
>>>>> >
>>>>> >> The advantage bigger than the one you mentioned is better seeing the
>>>>> intent of code.
>>>>> > Agreed.
>>>>> >
>>>>> > Thanks,
>>>>> >
>>>>>
>>>>> ----------------------------------------------------------------------
>>>>> 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

Reply via email to