发表日期: 2021-04-27 11:12:00 浏览次数:88
海安400电话申请开通【海安企业网站建设】海安微信公众号小程序开发运营价格、海安微信公众号APP软件客户端设计运营、海安网页页面设计公司费用、海安公司网站制作方案流程改版维护大概需要多少钱
海安,江苏省南通市代管的县级市,由“海水永不扬波”之意而得名,地处江苏省中南部,位于南通、盐城、泰州三大市交界处;东临黄海,东南与如东接壤,西与泰州市姜堰区为邻,南和如皋、西南和泰兴相连,北与东台毗邻;海安东西直线最长71.1千米,南北最宽39.35千米,全市总面积1184平方公里。 [1] 下辖4个街道、9个镇 [2] ,1个国家级开发区,1个省级高新区,1个省级商贸物流园,1个老坝港滨海新区。 [1] 常住人口86.45万人(2018年末), [3] 市人民政府驻中城街道长江中路106号 [4] 。
海安是江海文明的起源。海安境内的青墩遗址将江淮平原的历史追溯到6000年前,青墩遗址代表了新石器时代江淮东部先进水平。这里留下了苏中七战七捷的不朽神话和角斜红旗民兵团的革命薪火。 [1] 海安是历史形成的综合交通枢纽,汉代开凿上官运盐河过海安镇境, [1] 境内宁启铁路、新长铁路穿境而过,建设中的盐通高速铁路经过海安。海安市是“中国禽蛋之乡”、“中国茧丝绸之乡”、“中国湖桑之乡”、“中国河豚之乡”、“中国紫菜之乡”。 [5] 2018年,海安成功入围全国文明城市提名城市。 [6-7]
2018年11月,海安市入选2018全国“幸福百县榜” [8] 、2018年工业百强县(市)。 [9] 2018年11月,被科技部确定为首批创新型县(市)。 [10] 2019年10月8日,被评为2019年度全国综合实力百强县市、2019年度全国投资潜力百强县市、2019年度全国绿色发展百强县市。 [11-12] 2019年11月,被评为2019年工业百强县(市)、2019年中国创新百强县(市)。 [13] 第七批全国民族团结进步示范区(单位)。
Common Lisp的写法如下:
(defun foo (n) (lambda (i) (incf n i)))复制代码
Ruby的写法几乎完全相同:
def foo (n) lambda {|i| n += i } end复制代码
Perl 5的写法则是:
sub foo { my ($n) = @_; sub {$n += shift}}复制代码
这比Lisp和Ruby的版本有更多的语法元素,因为在Perl语言中必须手工提取参数。
Smalltalk的写法比Lisp和Ruby的稍微长一点:
foo: n |s| s := n. ^[:i| s := s+i. ]复制代码
因为在Smalltalk中,词法变量(lexical variable)是有效的,但是你无法给一个参数赋值,因此不得不设置了一个新变量,接受累加后的值。
JavaScript的写法也比Lisp和Ruby稍微长一点,因为JavaScript依然区分语句和表达式,所以需要明确指定return语句来返回一个值:
function foo (n) { return function (i) { return n += i } }复制代码
(实事求是地说,Perl也保留了语句和表达式的区别,但是使用了常规的Perl方式处理,因此可以省略return
。)
如果想把Lisp/Ruby/Perl/Smalltalk/JavaScript的版本改成Python,你会遇到一些限制。因为Python并不完全支持词法变量,你不得不创造一种数据结构来接受n的值。而且尽管Python确实支持函数数据类型,但是没有一种字面量的表示方式(literal representation)可以生成函数(除非函数体只有一个表达式),所以你需要创造一个命名函数,把它返回。最后的写法如下:
def foo (n): s = [n] def bar (i): s[0] += i return s[0] return bar复制代码
Python用户完全可以合理地质疑为什么不能写成下面这样:
def foo (n): return lambda i: return n += i复制代码
或者
def foo (n): lambda i: n += i复制代码
我猜想,Python有一天会支持这样的写法。(如果不想等到Python慢慢进化到更像Lisp,总可以直接……)
在面向对象编程的语言中,你能够在有限程度上模拟一个闭包(即一个函数,通过它可以引用由包含这个函数的代码所定义的变量)。你定义一个类(class),里面有一个方法和一个属性,用于替换封闭作用域(enclosing scope)中的所有变量。这有点类似于让程序员自己做代码分析,本来这应该是由支持词法作用域(lexical scope)的编译器完成的。如果有多个函数,同时指向相同的变量,那么这种方法就会失效,但是在这个简单的例子中,它已经足够了。
Python高手看来也同意这是解决这个问题比较好的方法,写法如下:
def foo (n): class acc: def __init__ (self, s): self.s = s def inc (self, i): self.s += i return self.s return acc (n).inc复制代码
或者
class foo: def __init__ (self, n): self.n = n def __call__ (self, i): self.n += i return self.n复制代码
我添加这一段是想避免Python爱好者说我误解这种语言。但是在我看来,这两种写法好像都比第一个版本更复杂。你实际上就是在做同样的事,只不过划出了一个独立的区域保存累加器函数,区别只是保存在对象的一个属性中,而不是保存在列表(list)的头(head)中。使用这些特殊的内部属性名(尤其是__call__
)看上去并不像常规的解法,更像是一种破解。
在Perl和Python的较量中,Python黑客的观点似乎是认为Python比Perl更优雅,但是这个例子表明,最终来说,编程能力决定了优雅程度。Perl的写法更简单(包含的语法元素更少),尽管它的语法有一点丑陋。
其他语言怎么样?前文曾经提到过Fortran、C、C++、Java和Visual Basic,看上去使用它们根本无法解决这个问题。肯 · 安德森说,Java只能写出一个近似的解法:
public interface Inttoint { public int call (int i);}public static Inttoint foo (final int n) { return new Inttoint () { int s = n; public int call (int i) { s = s + i; return s; }};}复制代码
这种写法不符合题目要求,因为它只对整数有效。
当然,我说使用其他语言无法解决这个问题,这句话并不完全正确。所有这些语言都是图灵等价的,这意味着严格地说,你能使用它们之中的任何一种语言写出任何一个程序。那么,怎样才能做到这一点呢?就这个小小的例子而言,你可以使用这些不那么强大的语言写一个Lisp解释器就行了。
这样做听上去好像开玩笑,但是在大型编程项目中却不同程度地广泛存在。因此,有人把它总结出来,起名为“格林斯潘第十定律”(Greenspun's Tenth Rule):
任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。
如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用:(a)使用一种强大的语言;(b)为这个难题写一个事实上的解释器;或者(c)你自己变成这个难题的人肉编译器。在Python的例子中,这样的处理方法已经开始出现了,我们实际上就是自己写代码,模拟出编译器实现词法变量的功能。
这种实践不仅很普遍,而且已经制度化了。举例来说,在面向对象编程的世界中,我们大量听到“模式”(pattern)这个词,我觉得那些“模式”就是现实中的因素(c),也就是人肉编译器。当我在自己的程序中发现用到了模式,我觉得这就表明某个地方出错了。程序的形式应该仅仅反映它所要解决的问题。代码中其他任何外加的形式都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码通过宏的扩展自动实现。
海安400电话申请开通【海安企业网站建设】海安微信公众号小程序开发运营价格、海安微信公众号APP软件客户端设计运营、海安网页页面设计公司费用、海安公司网站制作方案流程改版维护大概需要多少钱
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: https://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878