2007-09-27
模式匹配的实现和使用
关键字: Lysee 编程
模式匹配是个老概念了,它并不是函数式编程的必须内容,但函数式语言通常都实现了模式匹配,而大部分的命令式语言都空缺了这一块儿,所以给大家留下的印象就是模式匹配只在函数式编程中出现。
下面是一个常规的Fib编码:
再看一下模式匹配的写法:
对比两种编码的伪代码可以看出编译器对模式匹配函数自动添加了检测执行代码并进行了函数合并。一切就是这么简单。
模式匹配通常用于替代函数功能级的复杂分支语句,比如嵌套的if语句或switch语句。它的优点是在语法上实现了代码分离,有新的编码要求时只需增加新匹配模式或者删改已有的匹配模式即可,程序员无须维护一个复杂的分支函数。
下面举一个使用模式匹配的简单例子:
是否使用模式匹配是个习惯问题,也是个经验问题,有时只是老板个人的问题。
从技术上讲,条件越复杂,模式匹配就越有用,这点是可以肯定的。
下面是一个常规的Fib编码:
public int fib(int n)
{
if (n < 2) return 1;
return fib(n - 2) + fib(n - 1);
}
// 伪代码
public int fib(int n)
{
PUSH_VARB n
PUSH_INT 2
CALC <
JMPF 0006: POP
PUSH_INT 1
RETURN [1]
0006:PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 2
CALC -
CALL [2]
PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 1
CALC -
CALL [2]
CALC +
RETURN [1]
RETURN
}
再看一下模式匹配的写法:
public int fib(int n ? n < 2) // 要求: n < 2
{
return 1;
}
public int fib(int n)
{
return fib(n - 2) + fib(n - 1);
}
// 伪代码
public int fib(int n)
{
PUSH_VARB n
PUSH_INT 2
CALC <
JMPF 0007: POP
PUSH_INT 1
RETURN [1]
RETURN
0007:PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 2
CALC -
CALL [2]
PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 1
CALC -
CALL [2]
CALC +
RETURN [1]
RETURN
}
对比两种编码的伪代码可以看出编译器对模式匹配函数自动添加了检测执行代码并进行了函数合并。一切就是这么简单。
模式匹配通常用于替代函数功能级的复杂分支语句,比如嵌套的if语句或switch语句。它的优点是在语法上实现了代码分离,有新的编码要求时只需增加新匹配模式或者删改已有的匹配模式即可,程序员无须维护一个复杂的分支函数。
下面举一个使用模式匹配的简单例子:
<html>
<head>
<title>查看</title>
</head>
<body>
<% ==> begin CGI
public void display(string table id_field content_field click_field ID)
{
// 显示内容
= sys::db().selectStr(@"SELECT %(content_field) FROM %(table)
WHERE %(id_field)='%(ID)'").html();
// 增加点击量
sys::db().execSQL(@"UPDATE %(table) SET %(click_field)=%(click_field)+1
WHERE %(id_field)='%(ID)'");
}
// 建立模式匹配
public void view(string cate ID ? cate == "news") // 新闻
{
display("news", "news_ID", "news_content", "news_clicks", ID);
}
public void view(string cate ID ? cate == "file") // 文章
{
display("files", "file_ID", "file_content", "file_view_count", ID);
}
public void view(string cate ID ? cate == "msg") // 消息
{
display("msgs", "msg_ID", "msg_content", "msg_clicks", ID);
}
// 执行模式匹配
view(${request.cate}, ${request.ID});
==> END CGI %>
</body>
</html>
是否使用模式匹配是个习惯问题,也是个经验问题,有时只是老板个人的问题。
从技术上讲,条件越复杂,模式匹配就越有用,这点是可以肯定的。
- 11:04
- 浏览 (455)
- 论坛浏览 (595)
- 评论 (0)
- 相关推荐
发表评论
该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子
- 浏览: 3459 次
- 性别:

- 来自: 郑州

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
lysee 官方网站开张营业
RednaxelaFX 2008-05-20引用啊,来迟了。刚刚有空 ...
-- by libudi -
lysee 官方网站开张营业
啊,来迟了。刚刚有空在JavaEye逛的时候才发觉Lysee有新进展了,加油! ...
-- by RednaxelaFX -
lysee 官方网站开张营业
我认为,托管资源目前来说,主要是内存。不是handle。所谓托管资源,也就是由g ...
-- by 梁利锋 -
lysee 官方网站开张营业
猜的不错的话 GC 回收的托管资源,比如,链表、字典、内存流之类的,通常都是非托 ...
-- by libudi -
lysee 官方网站开张营业
google 了一下 Notification 和 FreeNotificati ...
-- by 梁利锋






评论排行榜