2012-02-02 2 views
22

Недавно я обнаружил, что я работаю с R-кодом, который находится по всей карте с точки зрения стиля кодирования - несколько авторов и отдельных авторов, которые не являются строгими в отношении к единственной структуре. Есть определенные задачи, которые я бы хотел автоматизировать лучше, чем я сейчас делаю.R языковой код для переформатирования/рефакторинга?

Я ищу инструмент (или инструменты), который управляет следующими задачами, перечисленными в порядке возрастания желания, но также в несколько возрастающем порядке скептицизма существования.

  • Основное форматирование. Такие вещи, как преобразование «if (foo)» в «if (foo)» и достижение единообразия в терминах расположения скобок и тому подобное.

  • Преобразование "foo $ blah" в "foo [[" blah "]]" для доступа к списку. В идеале он мог бы хотя бы сделать предположение, если объект действительно был списком, а не data.frame и только конвертирует списки.

  • Преобразование '=' в '< -'. Да, это простой поиск и замена - но не совсем. Инструмент (или регулярное выражение) должен знать язык таким образом, что он знает, чтобы преобразовать «x = 5», но не «foo (x = 5)». Также было бы очень приятно не просто заменить символ, но также обеспечить единое пробелы по обе стороны от оператора присваивания.

  • Переменное переименование, особенно по функциям &. Например, предположим, что в списке есть элемент «foo», мне бы хотелось изменить его до «foobar» один раз и не нужно отслеживать каждое использование этого списка во всем потоке кода. Я предполагаю, что это потребует, чтобы инструмент мог управлять потоком управления, чтобы идентифицировать такие вещи, как этот список, существующий как другое имя в другой функции.

  • Соглашения об именовании. Я хотел бы иметь возможность определить какое-либо стандартное соглашение об именах (например, Google's или что-то еще) и определить ли он все функции, переменные и т. Д. И преобразовать их. Обратите внимание, что это связано с предыдущей записью для таких элементов, как элементы списка.

Вы можете перечислить основные команды обработки UNIX (например, SED) до тех пор, как это будет на самом деле быть достаточно умны, чтобы по крайней мере, как правило, не винт вещи (например, преобразование «Foo (х = 5)» до " foo (x < -5) ").

Я предполагаю, что если бы такой инструмент уже существовал в идеальном состоянии, о котором я уже слышал об этом, и я также понимаю, что с таким языком, как R, трудно сделать некоторые из этих видов изменений автоматически, но можно мечтать, правильно? У кого-нибудь есть указатели на некоторые из них?

+2

переформатирования обсуждалось здесь: http://stackoverflow.com/questions/5117359/any-r-style-guide-checker –

+4

IIRC 'formatR' это один пакет, который очищает R и охватывает несколько пунктов в вашем списке. – baptiste

+1

Вторая цель может быть немного грязной: data.frame возвращает TRUE для 'is.list()'. Вы можете попробовать что-то вроде 'is.list (myObject) & (! Is.data.frame (myObject))'. – Iterator

ответ

2

ИМХО, напишите. Написание довольно принтера на самом деле довольно сложно. Это требует понимания токенизации, разбора, создания АСТ или других ИР, отслеживания таблиц символов и областей применения, шаблонов и т. Д.

Но если вы можете это сделать, вы действительно много узнаете о языках программирования в целом. Вы также будете выглядеть довольно впечатляюще для своих коллег, и поразительно надеяться на возобновление. Это также очень весело.

Я бы рекомендовал «Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages» от Terence Parr. Это немного грубо, чтобы читать, но контент довольно хорош. Это написано на вводном уровне для парсеров, и это довольно коротко, но в нем есть все части, которые вам нужно будет написать для этого инструмента самостоятельно.

Если вы его построите, с открытым исходным кодом, вернитесь сюда и расскажите об этом, а также разместите сайт с несколькими объявлениями, чтобы сделать себе несколько долларов. Таким образом, каждый может использовать ваше потрясающее творение, и вы получите несколько долларов в этом процессе.

удачи ...

+0

Я строю корректные символы для печати десятков языков, выполняя именно то, что вы говорите (ну, я использую DMS вместо ANTLR). Я могу сказать вам из горького опыта, что, если ваш форматировщик не включает в себя все возможности форматирования, которые можно себе представить, бесплатно и работает на Mac/Linux/Windows, люди будут хлопать по всем этим причинам. Удачи на самом деле. –

+0

Извините, что узнал об этом. Иногда люди могут быть хромыми. Согласитесь ли вы, что это полезное упражнение по программированию для обучения? Кстати, Ира является одним из крестных отцов парсеров и языковых переводов. Его мнение несет больше веса, чем Гейтс или Торвальдс по этому вопросу. Честно. – Homer6

+0

Ира, есть ли у вас рекомендации по другой книге? – Homer6

Смежные вопросы