mathematica.SE в настоящее время находится в частной бета-версии и откроется для общественности через несколько дней. Переполнение стека и связанные с ним сайты используют prettify.js, однако Mathematica не поддерживается. Было бы замечательно иметь пользовательское выделение script для нашего сайта, и я прошу помощь сообщества JavaScript и CSS в разработке такого script и сопровождающего CSS.
Ниже перечислены некоторые основные требования, так что он захватывает большинство функций схемы выделения по умолчанию Mathematica (игнорируя информацию, которая будет знать только внутренний парсер). Я также назвал цвета в целом - шестнадцатеричные цветовые коды можно выбрать из скриншотов, которые я предоставил (ниже). Я также добавил образцы кода, чтобы сопровождать скриншоты, чтобы люди могли проверить его.
Основные требования
-
Комментарии
Они вводятся как(* comment *)
. Поэтому все, что между ними должно быть выделено серым цветом. -
Строки
Они вводятся как"string"
(одинарные кавычки не поддерживаются) и должны быть выделены розовым цветом. -
Операторы/короткие нотные обозначения
Помимо стандартного+, -, *, /, ^, ==
и т.д., Mathematica имеет несколько других операторов и короткие обозначения. Наиболее часто встречаются следующие:@, @@, @@@, /@, //@, //, ~, /., //., ->, :>, /:, /;, :=, :^=, =., &, |, ||, &&, _, __, ___, ;;, [[, ]], <<, >>, ~~, <>
Эти и скобки, скобки и фигурные скобки должны быть выделены черным цветом.
-
Шаблоны объектов и слотов
Объекты шаблона начинаются с буквы и имеют либо_
, либо__
или___
, как, например,x_
,x__
иx___
. Они также могут иметь дополнительные буквы после подчеркивания, какx_abc
и т.д. Все они должны быть выделены зеленым цветом.Слоты
#
и##
, а за ним может следовать целое число#1
,##4
и т.д., а также должно быть зеленым.Оба эти объекта (шаблонные объекты и слоты) обычно завершаются оператором/скобкой/короткой формой из пункта 3. выше.
-
Функции/переменные
Функции и переменные здесь являются довольно свободной терминологией, но служат для целей этой публикации. Все, что не попадает в вышеуказанные 4, может быть выделено черным цветом. Mathematica часто использует backticks`
в коде и должна считаться частью имени функции/переменной. Например,abcd`defg
. Знаки доллара$
в любом месте имени переменной должны обрабатываться точно так же, как буква (т.е. Ничего особенного).
Для всех вышеперечисленных, если они появляются внутри строк, их следует рассматривать как таковые, т.е. "@~#
должен быть выделен розовым цветом.
Дополнительные приятные возможности:
- В объектах шаблона в пункте 3 выше, если под подчеркиванием (s) следует символ
?
, а затем некоторые буквы, то часть, следующая за_
, должна быть черной. Например, вx__?abc
частьx__
должна быть зеленой, а?abc
- черной. - Если функция/переменная начинается с заглавной буквы, то она подсвечивается черным цветом. Если она начинается с маленькой буквы, она подсвечивается синим цветом. Внутренне это отличает встроенные функции от определенных пользователем функций. Тем не менее, сообщество математики (почти везде) придерживается этого соглашения об именах довольно хорошо, поэтому различение двух будет служить определенной цели.
Скриншоты и примеры кода:
1. Простые примеры
Вот небольшой пример, содержащий скриншот в конце, показывающий, как он выглядит в Mathematica:
(*simple pattern objects & operators*)
f[x_, y__] := x Times @@ y
(*pattern objects with chars at the end and strings*)
f[x_String] := x <> "[email protected]"
(*pattern objects with ?xxx at the end*)
f[x_?MatrixQ] := x + [email protected]
<< Combinatorica` (*example with backticks and inline comment*)
(*Slightly more complicated example with a mix of stuff*)
Developer`PartitionMap[Total, [email protected], 3][[3 ;; -3]]~Partition~2 //
Times @@@ # &
2. Пример реального мира
Вот пример из этого моего ответа, который также указывает мою точку 2 в разделе "Дополнительные приятные вещи", т.е. строчные элементы выделяются синим цветом.
Кроме того, вы можете заметить некоторые из переменных, выделенных оранжевым цветом - я целенаправленно не включил это как требование, так как мне кажется, что гораздо сложнее обойтись без парсера, который знает Mathematica.
prob = MapIndexed[#1/#2 &,
Accumulate[
EuclideanDistance[{0, 0}, #] < 1 & /@ arrows // Boole]]~N~4;
Manipulate[
Graphics[{White, Rectangle[{-5, -5}, {5, 5}], Red, Disk[{0, 0}, 1],
Black, Point[arrows[[;; i]]],
Text[Style[[email protected][[i]], Bold, 18, "Helvetica"], {-4.5, 4.5}]},
ImageSize -> 200], {i, Range[2, 20000, 1]},
ControlType -> Manipulator, SaveDefinitions -> True]
Возможно ли это? Слишком много? Слишком сложно? Невозможно?
Совершенно откровенно, я не знаю ответа ни на один из них. Я только что перечислил некоторые основные функции, которые каждый на математике .SE хотел бы иметь и некоторые дополнительные вещи, которые были бы вишней на вершине. Однако, дайте мне знать, если их слишком сложно реализовать. Мы можем разработать меньший набор функций.
В знак признания этой помощи у вас у всех есть вечная благодарность сообщества Mathematica, и кроме того, , я награжу 500 бонусов каждому человеку, который вносит значительный вклад в это (если это делается по частям разные люди). Я буду опираться на ваши голоса/комментарии/выходы по ответам, чтобы решить, какой значительный (возможно, более чем один баунти одному человеку, если они выполняют всю работу). Реализация "Дополнительный приятный для использования" получает автоматическую +500 независимо от предыдущих бонусов, поэтому вы также можете опираться на работу других, даже если вы не делаете первую половину. Я также мог бы периодически размещать меньшие награды, чтобы привлекать пользователей, которые, возможно, не видели этого вопроса, поэтому, если вам случится заработать эти награды, они будут в дополнение к "щедрости, чтобы вознаградить существующий ответ", который будет решен до конца,
Наконец, я не тороплюсь. Поэтому, пожалуйста, не спешите с этим вопросом. Баунти всегда является опцией до тех пор, пока она не будет реализована SE (или если было определено, что существующие ответы полностью удовлетворяют требованиям). В идеале я надеюсь, что это реализовано 2/3rs нашего пути в бета-версию, которая проходит через 2 месяца.