Были ли пробелы в идентификаторах когда-либо идиоматическими? [закрыто]


43

Стиль C # предлагает использовать CamelCase в идентификаторах для разделения слов. Традиция Лиспа предлагает использовать вместо него тире.

Существовал ли когда-либо язык программирования, где использование пробелов в идентификаторах было не только разрешено, но и широко использовалось при использовании многословных идентификаторов?

В некоторых реализациях Scheme могут быть идентификаторы с пробелами , но это не очень распространенная практика. Вот пример:

Petite Chez Scheme Version 8.4
Copyright (c) 1985-2011 Cadence Research Systems

> (define |hey there| 100)
> (define |x y z| 200)
> (list |hey there| |x y z|)
(100 200)

Если у вас есть пространства имен, это форма составного идентификатора. Например , C ++: bobs_utilities :: string_functions :: scramble. Это имя, и мы можем включить произвольные пробелы, если захотим, потому что это синтаксис, а не простой токен. Имена с несколькими компонентами хотят быть абстрактным синтаксисом; Чистка информации о пространстве имен в едином идентификаторе - это, по сути, хак «искажение имени» для представления структуры внутри текста, где вам не хватает механизма для представления структуры.
Каз

Довольно часто встречается в JS, основным автором которого был парень из Scheme.
Эрик Реппен

1
@ErikReppen Насколько я знаю, пробелы недопустимы как часть идентификаторов JavaScript ...
Izkata

Не для вар нет. Для имен свойств мы можем использовать любую строку в скобках. например, alert({'some Prop':'bob'}['some Prop']);но если эти имена строковых свойств не проходят проверку идентификатора / метки, их нельзя использовать с точечной нотацией.
Эрик Реппен

В Ruby вы можете: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;и тогда вы можете: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"но это не распространено.
Дарек Нендза

Ответы:


66

Компиляторы FORTRAN игнорировали пробелы так:

   result = value * factor  
   r e s u l t = val ue * fac tor
   result=value*factor`

Были идентичны в том, что касается компилятора.

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


7
+1, это ново для меня. Я всегда задавался вопросом, почему я получил только B в Фортране, но теперь я знаю :)
NoChance

20
В руководстве Sun по ФОРТРАНу использовалось следующее предложение: «Последовательное разделение слов пробелами стало общим обычаем в десятом веке нашей эры и продолжалось до 1957 года, когда ФОРТРАН отказался от практики».
Blrfl

26

Visual Basic (и VBScript) также допускают пробелы в идентификаторах, если вы окружаете идентификатор квадратными скобками.

Dim [Hello World]
[Hello World] = 123

Однако это происходит довольно редко.



11

Ну, пробел это все о ... пробел:

Большинство современных языков программирования не учитывают синтаксис пробельных символов (пробелы, символы табуляции и новые строки), игнорируя их, как если бы их не было. Мы считаем это грубой несправедливостью по отношению к этим совершенно дружественным членам набора символов. Должны ли они игнорироваться только потому, что они невидимы? Пробелы - это язык, который стремится исправить баланс. Любые непробельные символы игнорируются; только пробелы, символы табуляции и перевода строки считаются синтаксисом.

К сожалению, Markdown не поддерживает его синтаксис, и я не могу показать вам некоторый код, но в Википедии есть пример кода, удобного для человека .


@ sepp2k Пробелы имеют метки.
Яннис

О, ты прав. Тогда не важно.
sepp2k

«Большинство современных языков программирования не учитывают символы пробела». Python делает :)
jadkik94

@ jadkik94 Python использует пробелы, но для отступа не в качестве идентификаторов.
Яннис

@YannisRizos О да. И также верно, что большинство языков вообще не используют пробелы (идентификаторы или нет)
jadkik94

11

В Алголе 68 у вас может быть место в идентификаторах (я не помню, были ли они значимыми или нет). Но ключевые слова были помечены обрезкой . Использование имен с пробелом в них было идиоматичным (по крайней мере, вокруг меня).

VHDL позволяет спасся идентификаторы со значительными пробелами в них: \foo bar\. Это позволяет также использовать ключевые слова в качестве идентификатора \and\, любой символ \n<42>\и регистр чувствительности в идентификаторах ( \Foo\и \foo\отличаются, в то время как Fooи fooэквивалентны, и отличаются от любого \Foo\и\foo\!). В Verilog также есть идентификаторы с пробелами с большинством этих характеристик (обычные идентификаторы чувствительны к регистру, и их выход без необходимости не создает другого идентификатора), но не допускает пробелов в них. Потребность в экранированных идентификаторах в VHDL и Verilog проистекает из того факта, что они часто создаются автоматически из других источников (например, схем), где идентификаторы обычно не имеют того же ограничения, что и в языке программирования; AFAIK, они не используются в других обстоятельствах.


Кажется, я помню (оглядываясь назад на 1980-е годы здесь!), Что CORAL делал нечто подобное - вы могли (и имели) пробелы в именах переменных, но ключевые слова тогда имели кавычки вокруг них (как 'DEFINE'и, личный фаворит 'COMMENT'. Мы использовали использовать макропроцессор, чтобы заменить их версиями без кавычек).
AAT

10

Я не знаю, считаете ли вы MediaWiki wikitext языком, но имена с пробелами определенно идиоматичны:

==Example==
This example lacks text.
{{Expand section}}

Где «развернуть раздел» - это имя шаблона (http://en.wikipedia.org/wiki/Template:Expand_section)

Я предполагаю, что это соответствует критериям - язык, где идентификаторы обычно содержат пробелы. Это никогда (я думаю?) Неоднозначно, потому что идентификаторы всегда окружены множеством знаков препинания, чтобы отделить их от необработанного вики-текста.


2
Хотя викитекст, безусловно, является формальным языком, я бы не назвал его языком программирования (в нем даже нет циклов).
svick

@svick: Ни Хаскель, ни Смолтк, ни Схема, ни Clojure, ни Эрланг, ни лямбда-исчисление, ни машины Тьюринга, ни Ио, ни Иок, ни Сеф…
Йорг Миттаг

@ JörgWMittag, но у них есть рекурсия, это просто другой способ выражения циклов. В Викитексте даже этого нет.
svick

@svick В зависимости от того, какие расширения вы установили, вы можете получить некоторые управляющие структуры в разметке MediaWiki. В частности, вы получаете ifS и рекурсию. Синтаксис и производительность довольно плохи, хотя. Шаблоны ведут себя во многом как функции, и их имена считаются идентификаторами в моей книге.
CodesInChaos

1
Интересно, что из [[Wikipedia: Transclusion]]: «На данный момент в программное обеспечение Mediawiki не встроены реальные функции зацикливания ... но есть некоторые приемы для их имитации. Например, многократный вызов шаблона, который несколько раз вызывает другой шаблон может имитировать двойной цикл. Шаблоны также могут быть принудительно вызваны самим собой (обычно это запрещено программным обеспечением Mediawiki после одного экземпляра, чтобы предотвратить бесконечные циклы) путем искусного использования перенаправлений (см. m: Template: Loop1 (обратные ссылки, edit)) См. также m: Help: Рекурсивное преобразование викитекста. "
Стив Беннетт

9

Inform 7 - это система для разработки интерактивной художественной литературы с использованием синтаксиса, подобного естественному языку, в котором многословные идентификаторы являются обычным явлением:

Mr Jones wears a top hat. The crate contains a croquet mallet. 

Ограничение, конечно, заключается в том, что идентификатор не может содержать ключевое слово, когда это будет неоднозначным.

Аналогичным образом, идентификаторы с подчеркиванием в Agda могут быть использованы mixfix, простейшим примером которого, вероятно, является if_then_else_оператор:

if_then_else_ : {A : Set} -> Bool -> A -> A -> A
if true  then x else y = x
if false then x else y = y

6

Scala позволяет произвольные идентификаторы с помощью обратных галочек. Обычно это используется для вызова, Thread.`yield`потому что yieldэто зарезервированное слово в Scala. Это может быть (ab) иметь пробелы в именах, хотя это будет далеко от идиоматического кода Scala:

val `the answer` = 42
println(`the answer`)

Черт возьми, вы даже можете иметь вкладки в идентификаторах:

scala> val `the\tanswer` = 42
the     answer: Int = 42

Я предполагаю , что это может предположительно быть идиоматическим для грамотного программирования народа. Может быть.


Scala позволяет символы как +в именах методов. Так что obj.a+=1, это было бы проанализировать, как если бы a+=это был метод. Изобретатель Мартин Одерский в своем учебнике предполагает, что программисты обычно включают пробелы, так что неоднозначности синтаксического анализатора практически не слишком проблематичны.
Джесвин Хосе

1
@aitchnyu: На самом деле, в смешанных идентификаторах буквенно-цифровая часть и операторская часть должны быть разделены подчеркиванием. obj.a+=1эквивалентно тому, obj.a += 1что эквивалентно obj.a.+=(1). Вам понадобится, obj.a_+=1если вы хотите, чтобы все работало так, как вы описали. (На самом деле, это даст ошибку разбора, вам нужно либо позвонить, obj.a_+=(1)либо obj a_+= 1.)
Jörg W Mittag

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


4

Вы можете подумать, что это имеет место в Cucumber / Gherkin , где имена функций фактически являются предложениями со встроенными в них аргументами.

Как расширение, я ожидал бы, что это будет более распространено в крошечных DSL , где язык должен быть дружественным для не разработчиков. Например, многие механизмы правил предоставляют возможность определять правила с англоязычным описанием, где пробелы могут использоваться в идентификаторах.


3

FWIW, Tcl допускает использование пробелов (и почти всех других символов) в идентификаторах, хотя использование этой функции не является распространенным явлением. Основная причина, по которой он не используется очень часто, заключается в том, что вы должны использовать правильное цитирование. Например, следующий код устанавливает переменную с именем «my name» в «bob», а затем печатает ее

set "my name" "bob"
puts "hello, ${my name}"

ОТО, это очень полезно при динамическом построении переменных, так как при создании таких переменных не нужно беспокоиться о недопустимых символах



1

Если вы считаете, что автоматизированное тестирование DSL является языком, среда роботов допускает пробелы в именах ключевых слов, и это очень идиоматично. В следующем примере «Say hello» - это имя ключевого слова, «Example test case» - это имя теста, а «$ {first name}» - переменная:

*** Keywords ***
| Say hello | [Arguments] | ${first name}
| | log | Hello, ${first name}

*** Test Cases ***
| Example test case
| | Say hello | world

1

Язык 4D допускает пробелы в именах методов и переменных. Как правило, он не одобряется в сообществе, но все встроенные методы и переменные используют их, когда это применимо ( SET MENU ITEM PARAMETERнапример,)


0

В Smalltalk есть ключевые методы, такие как a:b:c:пробелы, которые вызываются при вызове. Например: a: 100 b: 200 c: 300. Это стандартная идиома в языке.


0

Powershell допускает пробелы в именах переменных:

PS C:\> ${the var} = 100

PS C:\> ${the var}
100

0

Я видел упоминание о подобном для VB, но в JS это часто используется. Любое свойство объекта в JavaScript может быть доступно и задано в виде строки в квадратных скобках или просто в виде строк в литералах объекта. Имена свойств, которые не следуют правилам именования переменных JS, недоступны через. обозначения, но они удобны. Например, вы можете сопоставить URL-адреса с поведением или ссылаться на группу людей по имени, когда вы уверены, что все они уникальны. Это часто очень удобно и легко читается:

var peoplesFavoriteThings = {
    "Bob Jones":"kittens",
    "Jane Doe":"chainsaws"
}

for(var name in peoplesFavoriteThings){
    console.log(name + ' likes ' + peoplesFavoriteThings[name] + '.\n');
}

Это также упрощает реструктуризацию JSON для простоты использования без потери фактора мгновенного объекта при падении в JS.


Забавно, что это единственное упоминание о JavaScript. Да, методы и свойства могут содержать строки: foo['my method']()иfoo['my property']
Стив Беннетт

0

Power Query использует много автоматически сгенерированного кода. Я предполагаю, что более половины сгенерированных идентификаторов используют пробелы:

let
    Source = Sql.Database(".", "Test"),
    dbo_pvt = Source{[Schema="dbo",Item="pvt"]}[Data],
    #"Filtered Rows" = Table.SelectRows(dbo_pvt, each [VendorID] <= 4),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Emp1", "Emp2"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Emp3", "Emp4"}, {{"Count", each List.Sum([Emp5]), type number}})
in
    #"Grouped Rows"

Как вы можете видеть, как и во многих языках, существует дополнительный синтаксис для устранения неоднозначности идентификатора.

Но там, где это однозначно, дополнительный синтаксис не требуется:

let
    spaceRecord = [with space = 42, recursive record = @spaceRecord],
    drilldown = spaceRecord[recursive record][recursive record][recursive record][with space]
in
    drilldown   // 42


-1

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



-4

Изменить: Этот ответ был показан как неправильный, см. Комментарии.

Если я правильно понимаю ваш вопрос, компилятор не может разрешить использование пробелов в имени идентификатора, поскольку это может привести к дублированию имен (если только не используется разделитель). Например:

int my = 0; bool my count = false; int count = 0; если (мой граф) ...

Термин «мой счет» сбивает с толку, он может относиться либо к переменной, называемой «мой счет», либо, возможно, разработчик забыл написать оператор отношения, такой как> между my и count.

COBOL позволяет разделять имена разделов и разделов пробелами, но это не идентификаторы и переменные, как в вашем вопросе.


4
Ну, это не компилятор, это определение языка. Большинство языков не могут использовать пробелы в идентификаторах, потому что они могут привести к неоднозначности.
Стив Беннетт

2
Ваши рассуждения кажутся мне сомнительными. В вашем примере единственной альтернативой my Countимени переменной будет программист, сделавший опечатку. Это не двусмысленность. Неоднозначность была бы, если бы был другой действительный способ разобрать выражение. По тем же соображениям можно сказать, что разрешение a(b+c)- это неоднозначно, потому что, возможно, программист забыл >и действительно имел в виду a > (b + c).
sepp2k

1
Но (в языке, который допускает пробелы в именах переменных), также нет никакой двусмысленности if (my count). Вы не говорите, что есть другой, действительный способ разобрать это утверждение (что будет означать, что оно неоднозначно). Вы говорите, что если вы добавите персонажа <, вы получите другой, действительный анализ. И я говорю, что если вы добавите персонажа <к a(b+c)вам, вы получите другой, действительный анализ.
sepp2k

1
@ SteveBennett Верно. Любой язык, который допускает пробелы в именах переменных, должен либо запретить их в именах типов, либо использовать другой синтаксис для объявлений типов (например, скажем var name of the variable : type of the variable), либо вообще не иметь объявлений типов.
sepp2k

1
@ sepp2k, теперь я понял твою точку зрения. Спасибо, что нашли время, чтобы прояснить это. Мой ответ неверный.
NoChance
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.