标识符中的空格曾经是惯用的吗?[关闭]


43

C#风格建议在标识符中使用CamelCase来分隔单词。Lisp传统建议使用破折号代替。

是否曾经有一种编程语言,其中不仅允许在标识符中使用空格,还允许在使用多字标识符时使用一种常用的习惯用法?

在某些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。这是一个名称,如果需要,我们可以包含任意空格,因为它是语法,而不是简单的标记。具有多个组成部分的名称要使用抽象语法;将名称空间信息放到单个标识符中基本上是一种“名称修改”技巧,用于在文本内部表示结构,而您缺乏表示结构的机制。
哈兹(Kaz)2012年

在JS中很常见,他的主要作者是Scheme专家。
Erik Reppen

1
@ErikReppen据我所知,空格不能作为javascript标识符的一部分...
Izkata 2013年

不适用于vars。对于属性名称,我们可以在方括号中使用任何字符串。例如,alert({'some Prop':'bob'}['some Prop']);但是如果这些字符串属性名称未通过标识符/标签测试,则不能将它们与点符号一起使用。
Erik Reppen 2013年

在Ruby中,您可以:define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;然后可以:send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"但是并不常见。
DarekNędza2014年

Answers:


66

FORTRAN编译器忽略空格,因此:

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

就编译器而言,它们是相同的。

一些SQL方言允许在列名中使用嵌入的空格,但是在使用它们之前,必须先用反引号或其他定界符将它们括起来。


7
+1,这对我来说是新的。我一直想知道为什么我只在Fortran中获得B,但现在我知道了:)
NoChance 2012年

19
Sun的FORTRAN手册曾经包含以下句子:“始终用空格分隔单词已成为大约公元10世纪的一种普遍习俗,一直持续到1957年左右,当时FORTRAN放弃了这种做法。”
Blrfl 2013年

26

如果将标识符用方括号括起来,Visual Basic(和VBScript)还允许在标识符中使用空格。

Dim [Hello World]
[Hello World] = 123

但是,这样做很少见。


13

SQL算吗?

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

3
当然有可能,但是我不会认为这是惯用的。
约阿希姆·绍尔

3
如果需要遮罩,似乎不建议这样做。
用户未知

11

好吧,空格就是关于...空格:

大多数现代编程语言都不考虑空格字符(空格,制表符和换行符)语法,而忽略它们,就好像它们在那里一样。我们认为这对于字符集的这些完全友好的成员是不公正的。是否应该仅仅因为它们不可见而忽略它们?空格是一种寻求平衡的语言。任何非空白字符都将被忽略;仅空格,制表符和换行符被视为语法。

不幸的是Markdown不支持其语法,我无法向您展示一些代码,但是Wikipedia拥有一个人类友好的代码示例


@ sepp2k空格具有标签。
yannis'4

哦,对了。没关系。
sepp2k 2012年

“大多数现代编程语言都不考虑空格字符”。Python会做:)
jadkik94'4

@ jadkik94 Python确实使用空格,但是用于缩进的不是标识符。
yannis 2012年

@YannisRizos哦,是的。而且也确实是大多数语言根本不使用空格(无论是否使用标识符)
jadkik94'4

11

在Algol 68中,标识符中可以有空格(我不记得它们是否有意义)。但是关键词却被踩着了。使用带有空格的名称是习惯性的(至少在我身边)。

VHDL允许转义的标识符中包含大量空格:\foo bar\。这也允许使用关键字作为标识符\and\,任何字符\n<42>\在标识符和大小写(\Foo\\foo\是不同的,而Foofoo是等效的,并且来自不同或者\Foo\\foo\!)。Verilog还具有带有大多数这些特征的分隔标识符(普通标识符区分大小写,不必要地转义它们不会成为另一个标识符),但不允许在其中留空格。VHDL和Verilog中对转义标识符的需求来自于这样一个事实,即它们通常是自动从其他来源(例如原理图)中产生的,在这些来源中,标识符通常不受编程语言的限制。AFAIK,在其他情况下不会惯用它们。


我似乎记得(回顾这里的1980年代!),CORAL做了类似的事情-您可以(并且确实)在变量名中留有空格,但是关键字周围'DEFINE'加上了引号(例如,个人最喜欢的'COMMENT'。),使用宏处理器将其替换为未引用的版本)。
AAT 2012年

10

我不知道您是否认为MediaWiki Wikitext是一种语言,但是带空格的名称肯定是惯用语:

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

其中“展开部分”是模板的名称(http://en.wikipedia.org/wiki/Template:Expand_section)

我猜它符合标准-一种标识符通常包含空格的语言。这从来都不是模棱两可的,因为标识符总是被很多标点符号包围,以将其与原始Wiki文本分开。


2
虽然Wikitext当然是一种正式语言,但我不会将其称为编程语言(它甚至没有循环)。
svick

@svick:Haskell,Smalltalk,Scheme,Clojure,Erlang,Lambda微积分,Turing Machines,Io,Ioke,Seph都没有……–JörgW
Mittag

@JörgWMittag,但是它们具有递归,这只是表达循环的另一种方式。Wikitext甚至没有。
svick

@svick根据所安装的扩展,您会在Mediawiki标记中获得一些控制结构。特别是您得到ifs和递归。语法和性能虽然很差。模板的行为很像函数,它们的名称在我的书中算作标识符。
CodesInChaos

1
有趣的是,摘自[[Wikipedia:Transclusion]]:“到目前为止,Mediawiki软件尚未内置任何真正的循环功能...但是有一些技巧可以模仿它们。例如,反复调用一个模板,该模板反复调用a通过巧妙地使用重定向(请参阅m:Template:Loop1(反向链接,编辑)),另请参见m:Help:Wiki文本的递归转换。”
史蒂夫·贝内特

9

Inform 7是一个使用类似自然语言的语法来开发交互式小说的系统,在该系统中,多字标识符很常见:

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

当然,限制是当标识符不明确时,标识符不能包含关键字。

同样,可以在mixda中使用在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中的保留字。这可能(被滥用)在名称中使用空格,尽管与惯用的Scala代码相去甚远:

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

哎呀,您甚至可以在标识符中包含标签:

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

我想这对于有文化的编程人员来说可以是惯用的。也许。


Scala允许+使用方法名称中的字符。因此,对于obj.a+=1,它将像处理a+=方法一样对其进行解析。发明人马丁·奥德斯基(Martin Odersky)在其教科书中假定程序员通常包含空格,因此解析器的歧义实际上并不是太成问题。
耶斯文·何塞

1
@aitchnyu:实际上,在混合标识符中,字母数字部分和运算符部分需要用下划线分隔。obj.a+=1相当于obj.a += 1这相当于obj.a.+=(1)obj.a_+=1如果您希望它以您描述的方式工作,则需要拥有它。(实际上,这将产生解析错误,您需要致电obj.a_+=(1)obj a_+= 1。)
JörgW Mittag 2012年

那是没有标签的……这是一个空间站。所谓的空间站,是指制表符转义序列。
托马斯·爱丁


4

您可能认为在Cucumber / Gherkin中就是这种情况,其中函数名称实际上是带有嵌入参数的句子。

作为扩展,我希望这在小型DSL中更为常见,因为该语言应该对非开发人员友好。例如,许多规则引擎提供了使用类似于英语的描述来定义规则的能力,其中可以在标识符中使用空格。


3

FWIW,Tcl允许在标识符中使用空格(几乎所有其他字符),尽管利用此功能并不常见。它不经常使用的主要原因是您必须使用正确的引号。例如,以下将名为“我的名字”的变量设置为“ bob”,然后将其打印

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

OTOH,在动态构建变量时非常有用,因为在创建此类变量时,不必担心非法字符



1

如果您将自动测试DSL视为一种语言,则漫游器框架会在关键字名称中保留空格,这是很惯用的。在下面的示例中,“ Say hello”是关键字名称,“ Example test case”是测试用例名称,而“ $ {firstname}”是变量:

*** 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']
Steve Bennett

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 2012年

1
但是(使用允许在变量名中使用空格的语言)中也没有歧义if (my count)。您并不是在说有另一种有效的方式来解析该语句(这意味着其模棱两可)。您是说如果添加字符<,则会得到不同的有效解析。我的意思是,如果您向其中添加了字符<a(b+c)那么最终也会得到不同的有效解析。
sepp2k 2012年

1
@SteveBennett对。任何在变量名称中允许使用空格的语言都必​​须禁止在类型名称中使用空格,或者对类型声明使用不同的语法(例如say var name of the variable : type of the variable),或者根本不使用类型声明。
sepp2k 2012年

1
@ sepp2k,现在我明白了。感谢您抽出宝贵的时间说清楚。我的答案不正确。
NoChance 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.