Beh, sa che c'è tre argomenti così:
In[13]:= Function[x, Length[Unevaluated[x]], HoldAll][{1,
Sequence[2, 3], 4}]
Out[13]= 3
Se x è permesso di valutare, quindi
In[14]:= Function[x, Length[x], HoldAll][{1, Sequence[2, 3], 4}]
Out[14]= 4
EDIT: si vede meglio con:
In[15]:= Hold[{1, Sequence[2, 3], 4}]
Out[15]= Hold[{1, Sequence[2, 3], 4}]
in altre parole, l'appiattimento della sequenza richiede un valutatore.
EDIT 2: Ho chiaramente perso la vera domanda posta e proverò a rispondere ora.
Una volta che il grafico determina il numero di argomenti che genera {{style1, Line ..}, {style2, Line ..}, ...}. Nel caso di {1, Sequenza [2,3], 4} otteniamo la seguente struttura:
In[23]:= Cases[
Plot[{1, Sequence[2, 3], 4}, {x, 0, 1},
PlotRange -> {0, 5}], {_Hue, __Line},
Infinity] /. {x_Line :> Line, _Hue -> Hue}
Out[23]= {{Hue, Line}, {Hue, Line, Line}, {Hue, Line}}
Quando tracciato {1, {2,3}, 4} otteniamo una struttura diversa:
In[24]:= Cases[
Plot[{1, List[2, 3], 4}, {x, 0, 1},
PlotRange -> {0, 5}], {_Hue, __Line},
Infinity] /. {x_Line :> Line, _Hue -> Hue}
Out[24]= {{Hue, Line}, {Hue, Line}, {Hue, Line}, {Hue, Line}}
perché le liste sarebbero appiattite, semplicemente non usando il valutatore. Quindi, come si vede il tag nello stesso colore si verifica a causa della sequenza [2,3] viene trattato come una funzione black-box, che restituisce un elenco di due elementi:
In[25]:= g[x_?NumberQ] := {2, 3}
In[26]:= Cases[
Plot[{1, g[x], 4}, {x, 0, 1}, PlotRange -> {0, 5}], {_Hue, __Line},
Infinity] /. {x_Line :> Line, _Hue -> Hue}
Out[26]= {{Hue, Line}, {Hue, Line, Line}, {Hue, Line}}
stavo cercando di costruire un alto livello implementazione che costruirà una tale struttura, ma bisogna combattere il valutatore.Per esempio:
In[28]:= Thread /@ Function[x,
Thread[{Hold @@ {Range[Length[Unevaluated[x]]]}, Hold[x]}, Hold]
, HoldAll][{1, Sequence[2, 3], 4}]
Out[28]= Hold[Thread[{{1, 2, 3}, {1, Sequence[2, 3], 4}}]]
Ora dobbiamo valutare il filo senza valutare i suoi argomenti, che darebbe {{1, 1}, {2, Sequenza [2,3]}, {3, 4}} , dove il primo elemento della lista è un tag e il successivo una volta sono funzioni da campionare.
Spero che questo aiuti.
Domanda interessante, poiché 'Plot' ha l'attributo' HoldAll' che deve ancora espandere gli oggetti 'Sequence', il che implica che' Plot' dovrebbe vedere 4 elementi nell'elenco. – rcollyer
@rcollyer Gli oggetti sequenza verranno espansi solo al primo livello in una funzione con l'attributo 'HoldAll'. Confronta 'Hold [{1, Sequence [2, 3], 4}]' con 'Hold [1, Sequence [2, 3], 4]'. Lo stesso vale per "Valutare", ad es. 'Hold [{Evaluate [1 + 1]}]' vs 'Hold [Valuta [1 + 1]]'. – Szabolcs
@Szabolcs, non lo sapevo. Quindi, la risposta è semplicemente che "Sequenza" è espansa dopo che lo stile è stato impostato. Lo aggiungerei alla tua risposta in quanto suggerisce abbastanza chiaramente cosa sta succedendo. – rcollyer