Ceylon是一种定义结构化数据和常规程序代码的语言。在定义数据格式时,你遇到的第一件事就是需要“微语言”——用于表示某些数据类型字面值的字符字符串的语法验证。例如
- 电子邮件地址
- 电话号码
- 日期、时间和持续时间
- 正则表达式
- cron表达式
- URL和URI
- 十六进制数
例如,我们希望能够编写如下内容
Date date = '25/03/2005';
Time time = '12:00 AM PST';
Boolean isEmail = '^\w+@((\w+)\.)+$'.matches(email);
Cron schedule = '0 0 23 ? * MON-FRI';
Color color = 'FF3B66';
Url url = 'https://jboss.com.cn/ceylon';
mail.to:='gavin@hibernate.org';
PhoneNumber ph = '+1 (404) 129 3456';
Duration duration = '1h 30m';
我们希望编译器能够对这些字符字符串的格式进行某种语法验证。有时,这种验证可能只是正则表达式。但在其他情况下,更复杂的语法验证也是可行的。
因此,在Ceylon中,我们为这种情况保留了单引号字符字符串。我们还没有弄清楚如何处理确定单个引号字面值所遵循的特定格式的问题(它代表什么类型的字面值),以及如何在编译时对字面值进行格式验证。Ceylon不支持从左到右的类型推断,所以我们可能需要让您明确指定类型,例如
Date date = Date '25/03/2005';
Time time = Time '12:00 AM PST';
Boolean isEmail = Regex '^\w+@((\w+)\.)+$'.matches(email);
Cron schedule = Cron '0 0 23 ? * MON-FRI';
Color color = Color 'FF3B66';
Url url = Url 'https://jboss.com.cn/ceylon';
mail.to:=Email 'gavin@hibernate.org';
PhoneNumber ph = PhoneNumber '+1 (404) 129 3456';
Duration duration = Duration '1h 30m';
我认为这不是最佳选择,但它可能是最安全的。至于验证,我看到了两种可能性
- 允许应用程序提供插件验证器,一个在编译时被调用的Ceylon对象,或者
- 允许类型通过注解指定其字面值格式(这可能指定正则表达式,甚至可能是更强大的BNF)。
目前,我更倾向于第二种选择
class Color(format(Bnf '(`0`..`9`|`A`..`F`){6}') Quoted quoted) { ... }
支持引号字面值的一个后果是,我们可能会用反引号来引单字符字面值,例如`A`或`\n`.
事实上,在这个领域还需要更多的思考和实验。