7
$\begingroup$

I defined a function f like

f[x___, y_] := something; 

and if xs and y are all number, when I use this function, I would input like this:

f[1, 5, 3, 6, 3] 

For this, x = Sequence[1, 5, 3, 6] and y = 3.

Suppose that I have a list l = {1, 5, 3, 6}. Then I might use f like

f[l /. List -> Sequence, 3] 

using ReplaceAll to convert List to Sequence.

It is very good way to convert I think.

But, the problem is, when I want to input

f[1, {5, 3}, 6, 3] 

which is given by l = {1, {5, 3}, 6}, if I use /., ReplaceAll, {5, 3} is also converted into the sequence so the whole input becomes f[1, 5, 3, 6, 3], not f[1, {5, 3}, 6, 3].

I have searched several alternative functions like Replace which includes a levelspec option. But Replace can not convert List.

How can I convert without loss of inside lists?

$\endgroup$

3 Answers 3

10
$\begingroup$
l = {1, {5, 3}, 6} 

Then use:

f[Sequence @@ l, 3] 

f[1, {5, 3}, 6, 3]

$\endgroup$
4
  • $\begingroup$ Wow, what a wonderful solution! Thanks! $\endgroup$ Commented Aug 5, 2014 at 20:05
  • $\begingroup$ @Analysis. You're welcome, glad I could help. $\endgroup$ Commented Aug 5, 2014 at 20:06
  • $\begingroup$ @RunnyKine +1 Your short solution seems to be very stable $\endgroup$ Commented Aug 5, 2014 at 20:10
  • $\begingroup$ Thank you. This is just the ticket when needing to convert from a list to function entries. $\endgroup$ Commented Nov 25, 2016 at 18:18
8
$\begingroup$

Sequence @@ is probably the "right" way to do this for normal functions, but you should know that you can also use SlotSequence or BlankSequence in Function or replacement respectively:

l = {1, {5, 3}, 6} f[##, 3] & @@ l 
f[1, {5, 3}, 6, 3] 
l /. _[x__] :> f[x, 3] 
f[1, {5, 3}, 6, 3] 

These become important in the case where f holds its arguments:

SetAttributes[f, HoldAll] f[Sequence @@ l, 3] f[##, 3] & @@ l l /. _[x__] :> f[x, 3] 
f[Sequence @@ l, 3] f[1, {5, 3}, 6, 3] f[1, {5, 3}, 6, 3] 

Note that Sequence @@ l does not evaluate.

Further distinction is apparent between the second two methods when the input is to be held:

l = Hold[1 + 1, {5!, 3/0}, 6 - 1]; 

This causes evaluation because the Function was not also given the HoldAll attribute:

f[##, 3] & @@ l 

During evaluation of In[22]:= Power::infy: Infinite expression 1/0 encountered. >>

f[2, {120, ComplexInfinity}, 5, 3] 

This does not:

l /. _[x__] :> f[x, 3] 
f[1 + 1, {5!, 3/0}, 6 - 1, 3] 

Reference: Injecting a sequence of expressions into a held expression

$\endgroup$
1
  • $\begingroup$ Thanks for adding other scenarios. +1 $\endgroup$ Commented Aug 5, 2014 at 21:31
4
$\begingroup$

If it is just a matter of replacing the first List, then this could work also:

l = {1, {5, 3}, 6}; f[Delete[l, 0], 3] (*f[1, {5, 3}, 6, 3]*) 
$\endgroup$
3
  • $\begingroup$ Nice to see that you remember! +1 :-) $\endgroup$ Commented Aug 6, 2014 at 15:45
  • $\begingroup$ you always inspire me and your answer stick in my mind as far as I understand them :) $\endgroup$ Commented Aug 6, 2014 at 20:41
  • $\begingroup$ That makes me happy. Thanks. :-) $\endgroup$ Commented Aug 6, 2014 at 20:43

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.