Czy białe znaki w identyfikatorach były kiedykolwiek idiomatyczne? [Zamknięte]


43

Styl C # sugeruje użycie CamelCase w identyfikatorach do rozgraniczenia słów. Tradycja Lisp sugeruje użycie zamiast-myślników.

Czy kiedykolwiek istniał język programowania, w którym używanie spacji w identyfikatorach było nie tylko dozwolone, ale często używany idiom przy stosowaniu identyfikatorów wielosłówowych?

Możliwe jest posiadanie identyfikatorów ze spacjami w niektórych implementacjach schematu , ale nie jest to powszechnie praktykowana praktyka. Oto przykład:

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)

Jeśli masz przestrzenie nazw, jest to forma złożonego identyfikatora. Np C ++ bobs_utilities :: string_functions :: scramble. To jest nazwa i możemy dowolnie wstawiać białe znaki, ponieważ jest to składnia, a nie zwykły token. Nazwy z wieloma składnikami chcą być składnią abstrakcyjną; Informacja o przestrzeni nazw w pojedynczym identyfikatorze w jednym identyfikatorze to w zasadzie hack „mangling nazwy” do reprezentowania struktury w tekście, w którym brakuje mechanizmu reprezentującego strukturę.
Kaz

Dość powszechne w JS, którego głównym autorem był facet z Scheme.
Erik Reppen

1
@ErikReppen O ile mi wiadomo, spacje nie są poprawne jako część identyfikatorów javascript ...
Izkata

Nie dla vars nr. W przypadku nazw właściwości możemy użyć dowolnego ciągu w nawiasach. np. alert({'some Prop':'bob'}['some Prop']);ale jeśli te nazwy właściwości łańcucha nie przejdą testu identyfikatora / etykiety, nie można ich używać z notacją kropkową.
Erik Reppen

W Ruby możesz: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;a potem możesz: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"ale to nie jest powszechne.
Darek Nędza

Odpowiedzi:


66

Kompilatory FORTRAN zignorowały spacje, więc:

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

Były identyczne pod względem kompilatora.

Niektóre dialekty SQL dopuszczają osadzanie spacji w nazwach kolumn, ale zanim będą mogły zostać użyte, muszą być otoczone cudzysłowami lub innymi ogranicznikami.


7
+1, to dla mnie nowość. Zawsze zastanawiałem się, dlaczego dostałem tylko B w Fortranie, ale teraz wiem :)
NoChance 24.04. O

20
Podręcznik firmy FORTRAN firmy Sun zawierał to zdanie: „Konsekwentne oddzielanie słów spacjami stało się powszechnym zwyczajem około dziesiątego wieku naszej ery i trwało do około 1957 r., Kiedy FORTRAN porzucił tę praktykę”.
Blrfl

26

Visual Basic (i VBScript) zezwalają również na białe znaki w identyfikatorach, jeśli otoczysz identyfikator nawiasami kwadratowymi.

Dim [Hello World]
[Hello World] = 123

Jest to jednak dość rzadkie.


13

Czy SQL się liczy?

create table "Registered Members" (
    "Full Name" varchar(100),
    "Mailing Address" varchar(100),
    etc...
);

3
Z pewnością jest to możliwe, ale nie nazwałbym tego idiomatycznym.
Joachim Sauer

3
Jeśli potrzebujesz maskowania, wydaje się, że nie jest to zalecane.
użytkownik nieznany

11

Dobrze Biała spacja jest o ... spacje:

Większość współczesnych języków programowania nie uwzględnia składni białych znaków (spacji, tabulatorów i znaków nowej linii), ignorując je, jakby ich tam nie było. Uważamy to za rażącą niesprawiedliwość wobec tych doskonale przyjaznych członków zestawu znaków. Czy należy je zignorować tylko dlatego, że są niewidoczne? Biała spacja to język, który ma na celu przywrócenie równowagi. Wszelkie znaki spacje są ignorowane; tylko spacje, tabulatory i znaki nowej linii są uważane za składnię.

Niestety Markdown nie obsługuje jego składni i nie mogę pokazać ci kodu, ale Wikipedia ma próbkę kodu przyjazną dla człowieka .


@ sepp2k Białe znaki mają etykiety.
yannis

Masz rację. Nieważne więc.
sepp2k

„Większość współczesnych języków programowania nie uwzględnia białych znaków”. Python robi :)
jadkik94 27.04. O

@ jadkik94 Python używa białych znaków, ale dla wcięć nie jest to identyfikator.
yannis

@YannisRizos O tak. I prawdą jest również to, że większość języków w ogóle nie używa białych znaków (identyfikatorów lub nie)
jadkik94

11

W Algolu 68 możesz mieć miejsce w identyfikatorach (nie pamiętam, czy były znaczące, czy nie). Ale słowa kluczowe zostały oznaczone przez stropowanie . Używanie nazw ze spacją w nich było idiomatyczne (przynajmniej wokół mnie).

VHDL pozwala uciec identyfikatory z istotnych miejsc w nich \foo bar\. Pozwala to również używać słów kluczowych jak identyfikator \and\dowolny znak \n<42>\czułości i identyfikatorów w przypadku ( \Foo\i \foo\różnią się jednocześnie Fooi foosą równoważne, i różni się od albo \Foo\i\foo\!). Verilog posiada także identyfikatory z większością tych cech (w normalnych identyfikatorach rozróżniana jest wielkość liter, a ich unikanie niepotrzebnie nie tworzy kolejnego identyfikatora), ale nie dopuszcza do nich spacji. Potrzeba uciekających identyfikatorów w VHDL i Verilog wynika z faktu, że często są one wytwarzane automatycznie z innych źródeł (takich jak schemat), gdzie identyfikatory zwykle nie mają takich samych ograniczeń jak w języku programowania; AFAIK, nie są one używane idiomatycznie w innych okolicznościach.


Wydaje mi się, że pamiętam (patrząc tutaj na lata 80.!), Że CORAL zrobił coś podobnego - możesz (i miał) spację w nazwach zmiennych, ale słowa kluczowe zawierały wokół nich cudzysłowy (jak 'DEFINE'i osobisty faworyt) 'COMMENT'. aby użyć makroprocesora w celu zastąpienia ich wersjami bez cudzysłowu).
AAT

10

Nie wiem, czy uważasz Mediaite Wiki za język, ale nazwy ze spacjami są zdecydowanie idiomatyczne:

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

Gdzie „rozwinąć sekcję” to nazwa szablonu (http://en.wikipedia.org/wiki/Template:Expand_section)

Wydaje mi się, że spełnia kryteria - język, w którym identyfikatory zwykle zawierają spacje. To nigdy (nie sądzę?) Dwuznaczne, ponieważ identyfikatory są zawsze otoczone dużą ilością interpunkcji, aby oddzielić je od surowego tekstu wiki.


2
Chociaż Wikitext z pewnością jest językiem formalnym, nie nazwałbym go językiem programowania (nie ma nawet pętli).
svick

@svick: Ani do Haskell, Smalltalk, Scheme, Clojure, Erlang, Lambda Calculus, Turing Machines, Io, Ioke, Seph,…
Jörg W Mittag

@ JörgWMittag, ale mają one rekurencję, która jest po prostu innym sposobem wyrażania pętli. Wikitext nawet tego nie ma.
svick,

@svick W zależności od zainstalowanych rozszerzeń, masz pewne struktury kontrolne w znacznikach mediawiki. W szczególności dostajesz ifs i rekurencję. Składnia i wydajność są jednak dość złe. Szablony zachowują się bardzo podobnie do funkcji, a ich nazwy liczą się w mojej książce jako identyfikatory.
CodesInChaos

1
Interesujące, z [[Wikipedia: Transclusion]]: „Obecnie w oprogramowaniu Mediawiki nie ma żadnej wbudowanej funkcji zapętlania ... ale istnieją pewne sztuczki, aby je naśladować. Na przykład wielokrotne wywoływanie szablonu, który wielokrotnie wywołuje metodę inny szablon może naśladować podwójną pętlę. Szablony można również zmusić do wywoływania się (normalnie zabronione przez oprogramowanie Mediawiki po pojedynczym wystąpieniu, aby zapobiec nieskończonym pętlom), dzięki umiejętnemu wykorzystaniu przekierowań (patrz m: Szablon: Pętla 1 (linki zwrotne, edytuj)) Zobacz także m: Pomoc: Rekurencyjna konwersja wikitext. ”
Steve Bennett,

9

Inform 7 to system do rozwijania interaktywnej fikcji przy użyciu składni podobnej do języka naturalnego, w której powszechne są identyfikatory zawierające wiele słów:

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

Ograniczeniem jest oczywiście to, że identyfikator nie może zawierać słowa kluczowego, gdy byłoby to niejednoznaczne.

W podobny sposób, identyfikatory podkreślenia w Agda mogą być używane mixfix, którego najprostszym przykładem jest prawdopodobnie if_then_else_operatora:

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 zezwala na dowolne identyfikatory za pomocą odwróconych znaków. Zwykle używa się tego do wywoływania, Thread.`yield`ponieważ yieldjest to słowo zastrzeżone w języku Scala. Może to być (ab) mieć spacje w nazwach, chociaż byłoby to dalekie od idiomatycznego kodu Scala:

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

Do cholery, możesz nawet mieć zakładki w identyfikatorach:

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

Przypuszczam, że może to niewykluczone być idiomatyczne dla literat programowania folku. Może.


Scala dopuszcza znaki jak +w nazwach metod. Dlatego obj.a+=1parsowałoby to tak, jakby a+=była metodą. Wynalazca Martin Odersky w swoim podręczniku zakłada, że ​​programiści zwykle zawierają spacje, więc dwuznaczności parsera praktycznie nie są zbyt problematyczne.
Jesvin Jose,

1
@aitchnyu: W rzeczywistości w przypadku mieszanych identyfikatorów część alfanumeryczna i część operatora muszą być oddzielone znakiem podkreślenia. obj.a+=1jest równoważne z tym, obj.a += 1co jest równoważne z obj.a.+=(1). Musisz to mieć, obj.a_+=1jeśli chcesz, aby działało tak, jak to opisujesz. (W rzeczywistości spowoduje to błąd analizy, musisz zadzwonić obj.a_+=(1)lub obj a_+= 1.)
Jörg W Mittag

To nie ma karty… to stacja kosmiczna. Mówiąc o stacji kosmicznej, mam na myśli sekwencję ucieczki tabulatorów.
Thomas Eding,


4

Można to uznać za przypadek Cucumber / Gherkin , w którym nazwy funkcji są w rzeczywistości zdaniami z wbudowanymi w nie argumentami.

Jako rozszerzenie, spodziewam się, że będzie to bardziej powszechne w małych DSL , gdzie język powinien być przyjazny dla programistów. Na przykład wiele mechanizmów reguł umożliwia definiowanie reguł z angielskim opisem, w którym w identyfikatorach można używać spacji.


3

FWIW, Tcl dopuszcza spacje (i prawie każdą inną postać) w identyfikatorach, chociaż nie jest to często używane z tej funkcji. Głównym powodem, dla którego nie jest często używany, jest konieczność prawidłowego cytowania. Na przykład poniżej ustawia zmienną o nazwie „moje imię” na „bob”, a następnie drukuje ją

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

OTOH, jest to bardzo przydatne podczas dynamicznego budowania zmiennych, ponieważ tworząc takie zmienne, nie trzeba się martwić o nielegalne znaki



1

Jeśli uważasz, że zautomatyzowane testowanie DSL jest językiem, struktura robota dopuszcza spacje w nazwach słów kluczowych i jest to bardzo idiomatyczne. W poniższym przykładzie „Say hello” to nazwa słowa kluczowego, „Example test case” to nazwa przypadku testowego, a „$ {first name}” jest zmienną:

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

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

1

Język 4D dopuszcza spacje w nazwach metod i zmiennych. Na ogół nie jest to mile widziane w społeczności, ale wszystkie wbudowane metody i zmienne używają ich, gdy ma to zastosowanie ( SET MENU ITEM PARAMETERna przykład)


0

Smalltalk zawiera metody słów kluczowych, takie jak takie, a:b:c:które po wywołaniu obejmują spacje. Np a: 100 b: 200 c: 300. : To jest standardowy idiom w języku.


0

Powershell zezwala na spacje w nazwach zmiennych:

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

PS C:\> ${the var}
100

0

Widziałem wzmiankę o podobnym dla VB, ale w JS jest to często używane. Dostęp do dowolnej właściwości obiektu w JavaScript można uzyskać i ustawić w postaci ciągu za pomocą nawiasów kwadratowych lub po prostu jako ciąg znaków w literałach obiektu. Nazwy właściwości, które nie są zgodne z regułami nazewnictwa zmiennych JS, są niedostępne przez. notacja, ale są one przydatne. Na przykład możesz mapować adresy URL do zachowania lub odwoływać się do grupy osób po imieniu, jeśli masz pewność, że wszystkie są unikalne. Często jest bardzo wygodny i łatwy do odczytania:

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

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

Ułatwia to również restrukturyzację JSON dla łatwości użycia bez utraty czynnika obiektu natychmiastowego po upuszczeniu do JS.


Zabawne, że to jedyna wzmianka o JavaScript. Tak, metody i właściwości mogą zawierać ciągi: foo['my method']()ifoo['my property']
Steve Bennett

0

Power Query wykorzystuje wiele automatycznie generowanego kodu. Sądzę, że ponad połowa wygenerowanych identyfikatorów używa białych znaków:

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"

Jak widać, podobnie jak w wielu językach, istnieje dodatkowa składnia, aby jednoznacznie określić, czym jest identyfikator.

Ale w miejscach, w których jest to jednoznaczne, nie jest wymagana dodatkowa składnia:

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


-1

Język programowania o42a, który obecnie rozwijam, obsługuje nazwy złożone z wielu słów . Język nie zawiera żadnych słów kluczowych, a nazwy są zwykle oddzielone jakimś symbolem. W rzadkich przypadkach te dwie nazwy następują po sobie, do ich oddzielenia służy podkreślnik.



-4

Edycja: ta odpowiedź okazała się nieprawidłowa, patrz komentarze.

Jeśli dobrze rozumiem twoje pytanie, kompilator nie może dopuścić spacji w nazwie identyfikatora, ponieważ może to powodować zduplikowanie nazw (chyba że zostanie użyty separator). Na przykład:

int my = 0; bool moja liczba = fałsz; liczba int = 0; jeśli (mój hrabia) ...

termin „moja liczba” jest mylący, ponieważ może odnosić się do zmiennej o nazwie „moja liczba” lub może programista zapomniał napisać operator relacji, taki jak> między moim a liczbą.

COBOL pozwolił na oddzielenie nazw działów i nazw sekcji spacjami, ale nie są to identyfikatory i zmienne, jak w pytaniu.


4
Cóż, to nie jest kompilator, to definicja języka. Większość języków nie może dopuszczać białych znaków w identyfikatorach, ponieważ spowodowałoby to niejednoznaczność.
Steve Bennett

2
Twoje rozumowanie wydaje mi się trochę niepewne. W twoim przykładzie jedyną alternatywą dla my Countbycia nazwą zmiennej byłby programista, który popełnił literówkę. To nie jest dwuznaczność. Dwuznaczność byłaby, gdyby istniał inny prawidłowy sposób parsowania wyrażenia. Z tego samego powodu można powiedzieć, że pozwolenie a(b+c)jest niejednoznaczne, ponieważ być może programista zapomniał >i naprawdę miał na myśli a > (b + c).
sepp2k

1
Ale (w języku, który dopuszcza spacje w nazwach zmiennych), nie ma również dwuznaczności if (my count). Nie mówisz, że istnieje inny, prawidłowy sposób na parsowanie tego wyrażenia (co oznaczałoby, że jest on niejednoznaczny). Mówisz, że jeśli dodasz postać <, otrzymasz inną, prawidłową analizę. I mówię, że jeśli dodasz tę postać <do a(b+c)siebie, skończy się to inną, prawidłową analizą.
sepp2k

1
@SteveBennett Right. Każdy język, który dopuszcza spacje w nazwach zmiennych, musiałby albo nie zezwalać na nie w nazwach typów, albo stosować inną składnię dla deklaracji typu (jak powiedzmy var name of the variable : type of the variable) - lub w ogóle nie mieć deklaracji typu.
sepp2k

1
@ sepp2k, teraz mam twój punkt widzenia. Dziękujemy za poświęcenie czasu na wyjaśnienie. Moja odpowiedź jest niepoprawna.
NoChance
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.