免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 兰花仙子

较之Perl - Python的语法真奇怪 [复制链接]

论坛徽章:
0
发表于 2007-01-22 10:31 |显示全部楼层
lambda只是简单的返回一个表达式,连print语句都不能带,是远没有closure那么强大的.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2007-01-22 10:36 |显示全部楼层
原帖由 兰花仙子 于 2007-1-22 10:31 发表
lambda只是简单的返回一个表达式,连print语句都不能带,是远没有closure那么强大的.

的确是这样。
不过 Python 近年来一直都在发展,未来也许会提供更多的支持。
不过到时候也许 Perl6 早就出来了。

Python 现在正在经历 Perl 曾经经历过的动荡。
这对于一个语言来说是致命伤。

论坛徽章:
0
发表于 2007-01-22 11:31 |显示全部楼层
原帖由 兰花仙子 于 2007-1-22 10:31 发表
lambda只是简单的返回一个表达式,连print语句都不能带,是远没有closure那么强大的.

初学Perl,没研究过closure。在Scheme中lambda是可以返回一个完整的函数的。
closure中shift指令是否表示将参数偏移?
下面这个程序如果用闭报应该如何是实现?

#include <iostream>
using namespace std;
class PAIR{
private:
  int x, y;
public:
  PAIR(int a,int b)
  {
    x = a;
    y = b;
  }
  int get_x(void)
  {
    return x;
  }
  int get_y(void)
  {
    return y;
  }
};

PAIR cons(int x, int y)
{
  PAIR pair=PAIR(x,y);
  return pair;
}
int car(PAIR pair)
{
  return pair.get_x();
}
int cdr(PAIR pair)
{
  return pair.get_y();
}

int main(void)
{
  PAIR pair = cons(1,2);
  cout<<"car:"<<car(pair)<<"\n";
  cout<<"cdr:"<<cdr(pair)<<"\n";
  return 1;
}

论坛徽章:
0
发表于 2007-01-22 11:33 |显示全部楼层
原帖由 awake 于 2007-1-21 20:48 发表


或许
  1. print "true" if word in str
复制代码
是最方便的。

在python2.5里有一个类似的单行if...else...

论坛徽章:
0
发表于 2007-01-22 11:37 |显示全部楼层
原帖由 Rob 于 2007-1-21 17:14 发表
正因Perl内置了正则支持,所以少了很多字串操作函数吧。

是优点还是缺点?


少了啥?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2007-01-22 11:44 |显示全部楼层
原帖由 orangetouch 于 2007-1-22 11:37 发表


少了啥?

少了 if $word in $str
但是可以用 if $str =~ m'$word' 代替……

论坛徽章:
0
发表于 2007-01-22 11:51 |显示全部楼层
原帖由 flw 于 2007-1-22 11:44 发表

少了 if $word in $str
但是可以用 if $str =~ m'$word' 代替……


哪个语言有这种用法?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2007-01-22 11:52 |显示全部楼层
原帖由 netawater 于 2007-1-22 11:31 发表

初学Perl,没研究过closure。在Scheme中lambda是可以返回一个完整的函数的。
closure中shift指令是否表示将参数偏移?
下面这个程序如果用闭报应该如何是实现?

[quote]int main(void)
{
  PAIR pair = cons(1,2);
  cout<<"car:"<<car(pair)<<"\n";
  cout<<"cdr:"<<cdr(pair)<<"\n";
  return 1;
}
[/quote]
像这种带参数的需求,实在没必要用闭包,用普通的函数就可以了。
  1. sub cons($$) {
  2.     my ($x, $y) = @_;
  3.     return [$x, $y];
  4. }

  5. sub car {
  6.     my $pair = shift;
  7.     return $pair->[0];
  8. }

  9. sub cdr {
  10.     my $pair = shift;
  11.     return $pair->[1];
  12. }

  13. # main:
  14. my $pair = cons(1,2);
  15. print car($pair), "\n";
  16. print cdr($pair), "\n";
复制代码

如果只是为了展示闭包的用法而一定要用闭包,那么可以这么写:
  1. sub cons($$) {
  2.     my ($x, $y) = @_;
  3.     return (sub {return $x}, sub {return $y});
  4. }

  5. # main:
  6. my ($car, $cdr) = cons(1,2);
  7. print $car->(), "\n";
  8. print $cdr->(), "\n";
复制代码

论坛徽章:
0
发表于 2007-01-22 11:54 |显示全部楼层
原帖由 orangetouch 于 2007-1-22 11:51 发表


哪个语言有这种用法?

perl有

论坛徽章:
0
发表于 2007-01-22 12:03 |显示全部楼层
原帖由 alexru 于 2007-1-22 11:54 发表

perl有


Rob:正因Perl内置了正则支持,所以少了很多字串操作函数吧。是优点还是缺点?
orangetouch:少了啥?
flw:少了 if $word in $str 但是可以用 if $str =~ m'$word' 代替……
orangetouch:哪个语言有这种用法?
alexru:perl有

有的话咋用啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP