自然语言编程:从一段Perl程序说起

复制代码
#!/usr/bin/perl
use strict;
use warnings;

use Email::Valid;

my $email_address = 'a.n@example.com';

unless( Email::Valid->address($email_address) ) {
    print "Sorry, that email address is not valid!";
}

倒装句

上述代码简写成这样:

复制代码
valid email address : $email_address
print "..." if failed

注释:先执行,再处理错误❌

这两句若当成一句来处理,是可以实现的。但是,应该考虑用别的技术,如:

上下文有关文法?

上下文容器?

简单介绍一下"上下文容器",它是从Perl语言的"老地方变量"演变而来的。上面的例子中,执行完第一行,向上下文容器中推入一个布尔值,然后,下边那行从上下文容器中取一个布尔值。

例如:

求[1,2,3]的和至[s]

若不写至哪里,就至上下文容器。

在Perl语言里,老地方变量用下划线_表示,print(_)可以简写成print。所以,有如下代码:

复制代码
求[1,2,3]的和
打印

在上下文之间传递,所以叫上下文容器。

内置名

复制代码
valid email address:$email_address

这一句把email address说了两遍,显然应该用"内置名"处理一下:

复制代码
valid $email_address

内置名的作用在于,分析变量的名字,用于理解句子的含义。这个变量明显是个邮件地址,那么,valid就被解释成对邮件地址进行验证了。有了内置名,可以减少打字量,且更自然地表达。

具体怎么实现,似乎可以从词法分析下手。通过词法分析,可以判断一个符号是数字,还是id。更进一步地,可以判断一个符号,如:$email_address,这是一个邮件地址。然后,用类似于函数重载的技术,处理:

valid $email_address

它应该调用以下重载函数:

valid %email_address

(注:百分号%表示类型)

有很多东西可以被valid,所以它也有许多重载。

之前用正则表达式,好像不如这套方案好。

奋斗目标

前人编写一段程序,

用句子描述其功能。

后人写下这个句子,

调用前人劳动成果。

后人的后人,即电脑的使用者,也是用写下一些句子的形式,来操作电脑的。如果他懒得打字,还可以用语音输入。预计图形界面将不再是主流,命令行更流行。

相关推荐
萧鼎13 分钟前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
Anastasiozzzz41 分钟前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步1 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机1 小时前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经1 小时前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
R_.L1 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan1 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
云姜.1 小时前
java多态
java·开发语言·c++
CoderCodingNo2 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
陳10302 小时前
C++:红黑树
开发语言·c++