Как поддержать кодирование Allman Style в Go? - PullRequest
10 голосов
/ 11 июня 2011

Во всех проектах, с которыми я работал на других языках, предпочтительным стилем выбора был стиль Allman (стиль ANSI).Отсутствие стиля поддержки свободной формы (в скобках тоже) - это то, что я упускаю из других семейств языков синтаксиса в стиле C при работе в Go.

Может кто-нибудь придумать, как заставить компилятор Go принятьследующий крепкий стиль?

package main

import "fmt"

func main() 
{
    f()
    fmt.Println("Returned normally from f.")
}

func f() 
{
    fmt.Println("In function f.")
}

Примечание. Мне известны аргументы в пользу того, почему Go был разработан с таким искусственным «ограничением», но я на самом деле не покупаю его.Я твердо убежден в том, что используемый стиль поддержки должен определяться стандартом кодирования, принятым людьми или компанией, работающими над базой кода, а не навязываться самим языком.

Какпожалуйста, рассмотрите мой вопрос в рамках «как это можно сделать», а не «почему бы не сделать это и просто адаптировать».

Спасибо

Ответы [ 3 ]

8 голосов
/ 28 апреля 2014

Я удваиваю скобки.

if x < 0 {
{
    return sqrt(-x) + "i"
}}

Это не идеально, но лучше, чем пытаться сканировать столбцы 1-120 на наличие соответствующих фигурных скобок.

7 голосов
/ 11 июня 2011

Это может быть не совсем то, что вы ищете, но это один из возможных способов.

Вы могли бы написать «программу-переводчик», по сути, невероятно простой компилятор, который преобразует из того, что вы написали, эффективноВариант Go, к тому, что ожидает сам компилятор Go.

Вы можете сделать это с помощью программы, даже сценария оболочки, которая применяет регулярное выражение 's / (\ n) $ ^ \ s* {/ {\ 1 / g 'для всей программы (хотя для этого нужно будет просмотреть полную строку файла, а не разбивать ее построчно, поэтому вы не можете просто передать это выражение в качестве аргументак седу, например).Затем запишите преобразованный файл во временный и запустите на нем компилятор Go.

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

6 голосов
/ 11 июня 2011

Кратко, нет.Язык (или год или более назад) определен с помощью точек с запятой, и компилятор неявно вставляет точки с запятой в конце строк - если только в конце строки не стоит фигурная скобка.Итак, если вы пишете условие (которое не требует скобок, обратите внимание) и не ставите открывающую скобку в конце строки, то компилятор Go вставляет его для вас - оставляя нулевой оператор после if и фигурные скобки, заключающие блок, который выполняется безоговорочно.

@ epw предлагает переформатировать;Я думаю, что это разумное предложение.Go поставляется с gofmt для преобразования в канонический стиль Go.Вам нужно написать что-то для преобразования из канонического в стиль Allman и наоборот, и убедиться, что вы предварительно скомпилировали исходный код Go-Allman в Go-canonical формат, прежде чем скомпилировать его в объектные файлы.В целом, это более травматично, чем признать, что Go имеет свои собственные правила, которые не более эксцентричны, чем правила Python, и что проще всего идти в потоке и признать, что кодирование в Go предполагает кодирование не-Allman (приблизительно K & R)стиль.(Я люблю и использую стиль Allman в C; я использую Go-стиль в Go.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...