Чи був пробіл в ідентифікаторах колись ідіоматичним? [зачинено]


43

Стиль C # пропонує використовувати CamelCase в ідентифікаторах для розмежування слів. Традиція Lisp пропонує замість цього тире-тире.

Чи існувала коли-небудь мова програмування, де використання пробілів в ідентифікаторах було не тільки дозволено, але і загальновживану ідіому при використанні багатослівних ідентифікаторів?

У деяких реалізаціях схеми можуть бути ідентифікатори з пробілами , але це не є широко поширеною практикою. Ось приклад:

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, основним автором якого був хлопець Схеми.
Ерік Реппен

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@# @#$!!~"але це не часто.
Darek Nędza

Відповіді:


66

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

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

Ідентичні були щодо компілятора.

Деякі діалекти SQL дозволяють вбудовувати пробіли у назвах стовпців, але перед їх використанням потрібно оточити зворотні лапки або інший роздільник.


7
+1, це для мене нове. Мені завжди було цікаво, чому я отримав лише B у Фортран, але тепер я знаю :)
NoChance

20
Посібник FORTRAN Sun використовував для включення цього речення: "Послідовне розділення слів пробілами стало загальним звичаєм приблизно в десятому столітті нашої ери і тривало приблизно до 1957 року, коли FORTRAN відмовився від практики".
Blrfl

26

Visual Basic (і VBScript) також дозволяють пробіл в ідентифікаторах, якщо ви оточуєте ідентифікатор квадратними дужками.

Dim [Hello World]
[Hello World] = 123

Однак робити це досить рідко.



11

Ну, Whitespace - це все ... пробіл:

Більшість сучасних мов програмування не враховують синтаксис символів білого простору (пробіли, вкладки та нові рядки), ігноруючи їх, ніби їх там не було. Ми вважаємо це грубою несправедливістю для цих ідеально доброзичливих членів набору персонажів. Чи слід їх ігнорувати, лише тому, що вони непомітні? Пробіл - це мова, яка прагне виправити рівновагу. Будь-які символи без пробілів ігноруються; синтаксисом вважаються лише пробіли, вкладки та нові рядки.

На жаль, Markdown не підтримує свій синтаксис, і я не можу показати вам якийсь код, але у Вікіпедії є примірний для людини зразок коду .


@ sepp2k Whitespace має мітки.
янніс

О, ти маєш рацію. Не забудьте тоді.
sepp2k

"Більшість сучасних мов програмування не враховують символи пробілу". Python does :)
jadkik94

@ jadkik94 Python використовує пробіл, але для відступу не як ідентифікаторів.
янніс

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

11

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

VHDL дозволяє врятувався ідентифікатори із значними прогалинами в них: \foo bar\. Це дозволяє також використовувати ключові слова в якості ідентифікатора \and\, будь-якої \n<42>\чутливості символів і регістру в ідентифікаторах ( \Foo\і \foo\вони різні, хоча Fooі fooеквівалентні, і відрізняються від будь-яких \Foo\і\foo\!). Verilog також має ідентифіковані ідентифікатори з більшою частиною цих характеристик (звичайні ідентифікатори чутливі до регістру, а уникнення їх без необхідності не робить іншого ідентифікатора), але не дає пробілів у них. Необхідність уникнутих ідентифікаторів у VHDL та Verilog випливає з того, що вони часто виробляються автоматично з інших джерел (наприклад, схематичних), де ідентифікатори зазвичай не мають таких же обмежень, як у мові програмування; AFAIK, вони не ідіоматично використовуються в інших обставинах.


Я, мабуть, пам’ятаю (озираючись на 1980-ті роки тут!), Що CORAL робив щось подібне - у вас міг (і був) пробіл у змінних іменах, але ключові слова тоді мали цитати навколо них (як-от 'DEFINE'і особистий фаворит) 'COMMENT'. Ми використовували використовувати макропроцесор, щоб замінити їх на не цитовані версії).
AAT

10

Я не знаю, чи вважаєте ви Вікітекст MediaWiki мовою, але імена з пробілами, безумовно, ідіоматичні:

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

Де "Розгорнути розділ" - це назва шаблону (http://en.wikipedia.org/wiki/Template:Expand_section)

Я думаю, він відповідає критеріям - мові, де ідентифікатори звичайно містять пробіли. Це ніколи (я гадаю?) Неоднозначне, тому що ідентифікатори завжди оточені безліччю пунктуацій, щоб відокремити їх від сирого тексту вікі.


2
Хоча wikitext, безумовно, є формальною мовою, я б не називав це мовою програмування (у нього навіть немає циклів).
svick

@svick: Не робити Haskell, Smalltalk, Scheme, Clojure, Erlang, Lambda Calculus, Turing Machines, Io, Ioke, Seph,…
Jörg W Mittag,

@ JörgWMittag, але вони мають рекурсію, це просто інший спосіб вираження циклів. У Вікітексту навіть такого немає.
svick

@svick Залежно від встановлених розширень, ви отримуєте деякі керуючі структури в розмітці mediawiki. Зокрема, ви отримуєте ifрекурсію. Синтаксис та продуктивність дуже погані. Шаблони ведуть себе майже як функції, а їхні імена вважаються ідентифікаторами в моїй книзі.
CodesInChaos

1
Цікаво, що з [[Wikipedia: Transclusion]]: "Немає справжнього циклічного функціоналу, вбудованого в програмне забезпечення Mediawiki станом на цей час ... але є деякі хитрощі для їх імітації. Наприклад, неодноразовий виклик шаблону, який неодноразово викликає a різні шаблони можуть імітувати подвійний цикл. Шаблони також можуть бути примушені викликати себе (зазвичай це заборонено програмним забезпеченням Mediawiki минулого одного екземпляра для запобігання нескінченних циклів), вмілим використанням переадресацій (див. m: Шаблон: Loop1 (зворотні посилання, редагувати)) Див. також m: Довідка: Рекурсивна конверсія wikitext. "
Стів Беннетт

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 дає пробіли (і майже всі інші символи) в ідентифікаторах, хоча користуватися цією функцією не так часто. Основна причина, яку він не використовується дуже часто, полягає лише в тому, що ви повинні використовувати належне котирування. Наприклад, нижче встановлюється змінна назва "моє ім'я" на "bob", після чого друкується

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

OTOH, це дуже корисно при динамічному побудові змінних, оскільки при створенні таких змінних не потрібно турбуватися про незаконні символи



1

Якщо ви вважаєте мову автоматизованого тестування DSL мовою, рамки роботів дозволяють пробіли у назвах ключових слів, і це дуже ідіоматично. У наступному прикладі "Скажіть привіт" - це ключове слово, "Приклад тестового випадку" - це тестовий випадок, а "$ {ім'я}" - змінна:

*** 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

Я бачив згадку про подібне для 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, який я зараз розробляю, підтримує багатослівні імена . У мові взагалі немає ключових слів, імена зазвичай розділені деяким символом. У рідкісних випадках два імені слідують один за одним, підкреслення використовується для їх розділення.


-2

Авторське програмне забезпечення, мова сценаріїв якого базувався на не об’єктно-орієнтованому Pascal, дозволяла пробіли в назвах змінних, хоча з часом люди виявили проблеми з їх використанням та віддалилися від нього http://books.google.com/books?id= bHC88YignAkC & pg = PA428 & lpg = PA428 .


-4

Редагувати: Ця відповідь виявилася неправильною, дивіться коментарі.

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

int my = 0; bool my count = помилково; int count = 0; якщо (мій граф) ...

термін "мій рахунок" заплутаний, він може або посилатися на змінну під назвою "мій рахунок", або, можливо, розробник забув написати оператор відношення, такий як> між моїм і лічильним.

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.