嵌入目标-Smalltalk

2020-05-15 10:34:02

Ilja只是询问嵌入式脚本语言的建议,大概是给他的车库E-Bay列表经理,所以我当然推荐Objective-Smalltalk。讽刺的是:-)这有点吓人。一方面,Objective-Smalltalk在我自己的应用程序中已经使用了十多年,运营着http://objective.st网站,两者都没有任何故障,后者对黑客新闻“死亡拥抱”(Hug Of Death)毫无反应,甚至没有一丝故障。另一方面,嗯,这很可怕。至于可用性,您的应用程序捆绑包中包含两个框架,启动和与一个或多个解释器交互的代码也相当少,尤其是因为我已经使用过,所以现在在相当多的应用程序中,不便会随着时间的推移而逐渐减少。就适合性而言,我当然不能回答这个问题,只能说这绝对是有史以来最好的。我还可以补充说,另一个MacOS嵌入式Smalltalk,FScript,在许多产品中都得到了成功的使用。无论如何,Ilja至少假装认真对待我的建议,并回答了关于代码在实践中会是什么样子的问题:对我来说,Objective-Smalltalk中这样的自定义脚本会是什么样子对我来说并不明显。以下是结束&;重新启动某些清单的JavaScript伪代码示例。这在Obj-St会是什么样子?pic.twitter.com/UjbwUD0Q4b。

-Ilja A.Iwas(@iljawascoding)2020年5月13日。

我非常乐意回答这个问题,但是这个答案有点超出了Twitter的范围,因此我发布了这篇博客文章。首先,我们可以使内容非常接近原始内容,只需将循环替换为a-select:,当然还可以将语法更改为Objective-Smalltalk。runningListings:=context getAllRunningListings.listingsToRelist:=runningListings select:{:Listing|Listing day sRunning>;30 and:ListingWatch<;3.}易趣End Listings:ListingsToRelist结束:{:End|eBay Relistings:End Relisted:{:Relsted|UI alert:";Relisted:{Relsted}";。}}。

请注意使用";和:";代替";&;&;";,以及符号的一般缩写。虽然我个人不喜欢末日金字塔,但关键字消息语法让它不那么令人讨厌。事实上,SWIFT最近针对多个尾随闭包的特殊情况采用了OPEN关键字语法。当然,这个想法有点令人费解,但这是一个单独的帖子的主题。那么,我们还可以如何简化呢?嗯,上下文看起来有点不明确,而getAllRunningListingsa有点专门化,它可能有很多朋友,这些朋友是将一个有大量资源的网站映射到一个过程接口上的。让我们转而使用URL来实现这一点,因此eBay:方案封装了eBay允许我们使用的资源。listingsToRelist:=eBay:Listings/Running Select:{:Listings|Listings day sRunning>;30 and:ListingsToRelist<;3.}易趣End Listings:ListingsToRelist End:{:End|eBay Relist Listings:End Relsted:{:Relsted|UI alert:";Relsted{Relsted}Listings";。}}。

我必须承认,我也不太了解在重新挂接过程中使用回调,因为在进入下一阶段之前,我们正在等待一切完成。因此,让我们将其作为普通顺序代码实现:listingsToRelist:=eBay:Listings/Running Select:{:ListingsToRelist:=eBay:Listings/Running Select:{:ListingsListings;Running>;30 and:Listing Watcher<;3。}结束:=eBay endListings:listingsToRelist.reliect。

(在脚本环境中,Objective-Smalltalk目前允许通过为变量赋值来定义变量。可以将其关闭。)。然而,清单不应该知道怎么做,这看起来有点奇怪,而且有点不面向对象,那么让relist和end成为清单本身的方法怎么样?这样,代码将简化为以下内容:listingsToRelist:=eBay:Listings/Running Select:{:ListingsListings/Running Select:{:Listing|Listing day sRunning>;30 and:ListingsToRelist Collect End。}End:=listingsToRelist Collect End.Relisted:=End Collect Relest.ui alert:";Relisted:{Relsted}";。

如果批处理操作是典型的,则可能需要一个了解这些操作的Listings集合:listingsToRelist:=eBay:Listings/Running Select:{:ListingsListings/Running Select:{:Listing|Listing day sRunning>;30 and:ListingsToRelist end.relisted:=listingsToRelist end.relisted:=end relist.ui alert:";relisted:{Relsted}";。

在这里,我假设结束和重新启动可能失败,因此这些操作需要返回成功的列表。哦,您可能想给那个谓词命名,这样就可以用一个干净的、按我的意思做的HigherOrder消息来替换最后一个官样文章。哦,既然我们使用←已经有一段时间了,如果您愿意,您也可以使用Unicode进行分配。Extension EBayListing{-<;bool>;shouldRelist{self daysRunning>;30 and:self watche

在我看来,这显然是完全不偏不倚的,除了它是可执行的之外,它看起来非常接近要采取的操作的高级伪代码规范。这是一个很好的循序渐进的脚本,但是现在一切都很紧凑,我们可以去掉临时变量(假设扩展名),使其成为一行程序(加上警告):应该注意的是,一行程序不是为了最大限度地压缩代码而牺牲可读性的结果,而是通过消除问题的症结而提高可读性的间接结果。虽然在这种情况下不需要(发送非规则消息的优先规则使事情变得明确),但一些管道分隔符可能会让事情变得更清楚一些。