Из справки:
Sort orders symbols by their names, and in the event of a tie, by their context
Итак, вам нужна еще одна функция, а не Sort [] ...
Редактировать
Вот способ заставить только числовую сортировку в ваших помещениях:
sortN[s_, f_: (OrderedQ[{#1, #2}] &)] :=
(*Check if everything is eval to a number*)
If[And @@ (NumericQ /@ s),
(*and then sort*)
Sort[s, f],
(*if something not numeric,
reconstruct the function call and return it*)
If[(ToString[f] == ToString[OrderedQ[{#1, #2}] &]),
Print[Unevaluated[sortN[s]]], Print[Unevaluated[sortN[s, f]]]];]
Использование:
In[120]:= sortN[{3,2,1,4}]
Out[120]= {1,2,3,4}
In[121]:= sortN[{3,2,1,Sin}]
Out[121]= sortN[{3,2,1,Sin}]
In[122]:= sortN[{1,2,3,4},Greater]
Out[122]= {4,3,2,1}
In[123]:= sortN[{1,2,3,Log},Greater]
Out[123]= sortN[{1,2,3,Log},Greater]
Обратите внимание, что
Каждый символ в списке будет оцениваться дважды, один раз для проверки, является ли он числовым, а затем для сортировки.Этого можно обойти, сохранив промежуточный результат до получения NumericQ. Редактировать Подумав еще раз, я не совсем уверен ... возможно, кто-то еще сможет уточнить это.
Выражение считается числовым значением, если онолибо явное число, либо математическая константа, такая как Pi, либо функция, имеющая атрибут NumericFunction и все аргументы которой являются числовыми величинами.В большинстве случаев NumericQ [expr] дает True всякий раз, когда N [expr] дает явное число.
Изменяя NumericQ для StringQ или что угодно (или добавляя его в качестве параметра для sortN [], вы можете выбрать Type , который вы хотите форсировать и отсортировать.