GolfScript的改进版本


12

我计划为甚至可以做更多事情的较短程序编写改进的GolfScript。这不是挑战。这是一个对我应该做的事情的反馈和提示的请求。(请参见标签)

我不确定这是否应该是Community Wiki。如果您是这样认为的,只需标记一个主持人即可将其转换:)

这种语言将与GolfScript非常相似。它仍然是用Ruby编写的。但是,它有一些区别:

  • 使用`作为字符串分隔符,因为它是一个不常见的词,所以更少的逃脱是必要的。(另一个字符可以代替其功能,例如#(稍后会详细介绍))。\`逃避反引号,\\逃避反斜杠,并且没有其他逃避序列。如果需要换行符,只需在字符串中插入实际的文字换行符即可。
  • 使用Ruby的Rational任意精度浮点数,这是GolfScript的主要缺陷之一。
  • 将类型转换为其他类型的能力。例如,您可以将块转换为字符串。
  • 常用表达。可能是用创建的"..."。运营商也将为此而超负荷。例如,"\W"~{`Invalid: non-word character`}{`OK`}if。从变量(如块)中推送时将自动执行。
  • File和Date对象,以执行GolfScript中无法完成的更多工作。这些将没有文字,但是将具有用于初始化它们的功能,例如`file.txt`fl(文件制作功能的名称可能会更改)。
  • 可能是哈希,但是我不确定是哪一个。我是不是该?
  • 辅助功能可以做更多的事情。例如,`http://example.com`net对于网络访问(同样,net可以重命名运营商)。rb将字符串作为Ruby代码执行。这些将会更多。建议欢迎。
  • 没有评论,因此#可以用于其他用途。如果您想发表评论,`comment here`;将可以正常工作。(也许#可以代替`的功能)
  • 它将被完全重写,从而可以轻松添加功能。基本上,代码将更具可读性。(您是否看到过GolfScript源代码?:/
  • 它将在Github上,因此可以进行协作工作。我将在麻省理工学院(MIT)或其他方面获得许可。
  • 没有最后的换行符,所以狡猾的奎因工作:P

我将它们区分开,因为我认为它们是最激烈,最有用的更改(可能添加浮点除外):

  • 它将内置许多Ruby函数。例如,shuffle(可以缩写为sf)(以前为9个字符),tr(以前为14个字符),samplesm以前为.,rand=),flattenfl以前为???)等。
  • 它会像Rebmu一样被静音。例如,现在您可以~:a0<{0a-}aIF(使用字母变量名称)代替~:$0<{0$-}$if(覆盖排序功能)。(此处的示例)。请注意,这种方式不区分大小写,并且变量名中不允许使用数字。我认为这是可以的,因为它是一种高尔夫语言:P
  • 它将进行调试。我将添加以下功能:提供一个标志,用于指定数组定界符,元素定界符等,数字输出(有理数,浮点数或int?),一次执行一个指令,标记化并输出每个标记,而不是运行程序,等等

所以,我的问题是:有什么要改进的?您认为我应该补充什么?

在开始编码之前还有其他想法吗?


一定要意识到,如果添加糊糊,则会失去区分大小写的能力。
marinus 2013年

@marinus我意识到这一点。我应该明确地说;编辑...
门把手

同样,它真正需要的是一种进行显式I / O(用于交互式程序)的方法。解释器可以事先检查程序是否使用显式I / O,如果不使用隐式I / O,则仅进行隐式I / O。
marinus 2013年

@marinus太好了,您应该加上答案:)
门把手

1
@Claudiu我对新语言的开发还很活跃,尽管我最近很忙,所以我已经有一段时间没有做太多事情了。其中一些想法不是好主意,我没有使用:P
Doorknob

Answers:


17

灵活的I / O

Golfscript目前不能用于交互式程序。我提出了明确的输入某些功能被添加(即readlinegetchar和朋友)。解释程序应该在运行之前查看程序是否使用了它们。

如果程序未调用任何输入函数,则解释器的行为应与Golfscript正常一样。

我不希望解释器在运行时生成的评估代码中检测到输入函数,但是如果它能够以某种方式做到这一点,那就值得赞扬。


这是一个好主意; 限制io是golfscript的最大限制之一。+1
门把手

11

内置更短

所有内置命令的单字符别名。base如果仅仅是我会用很多B


但是,如果您将其b用作变量名呢?仍然; 好主意; 您只记得要使用该功能时不要使用该名称,如果您不使用该功能,那么它根本不会影响您。
门把手

@DoorknobofSnow,您已经可以使用内置变量(甚至是诸如^或的标记$)作为变量名。这不会使这个问题变得更糟。此外,我建议使用别名以允许向后兼容,因此,如果您为较短的别名分配了其他名称,则只需使用较长的名称。
彼得·泰勒

4
Z对于zip也将非常有用。
霍华德

也许我们可以发布GolfScript 的官方标准库。但是我不清楚如何将其包含在解决方案中(丢失#include"#{IO.read'lib'}"~过长)。
霍华德

@Howard现在这是一个主意...我可以将库添加到我的语言中,也许像mylang -Llibname somefile.ext
门把手

9

组合div-mod

这比一些建议要合适一些,但是在使用数论程序时,我经常发现自己想要一个操作,该操作从堆栈中弹出两个整数ab然后推入a/ba%b。(目前是1$1$/@@%)。


由于它是如此的利基,也许像dvmDiV-Mod。感谢您的所有想法:-) +1
门把手

8

号码

更改词法分析器,使前导0不属于数字:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

负数也应_改为:

# current behaviour
1 2-3   # -> -1 3

# new
1 2_3     # -> 1 2 -3

哇,真有趣。通常,您通常不会连续输入两个数字,但这会有所帮助。负面的事情也很大,而不是0 100-负面的100。+1
门把手

1
我以前考虑过 完全不应该支持负整数文字。已由处理~。例如-1是0~。这使少数数字的长度增加了一个字符,但是消除了后面对空格的适度使用-
彼得·泰勒

请稍等,您将如何推,例如1001?我认为您的意思是领先零,而不是落后。
门把手

@DoorknobofSnow对。
霍华德

您会想到做{0\-}:~;~负数化)和not按位使用(就像and or xor)吗?
门把手

8

访问整个堆栈

GolfScript是一种基于堆栈的语言,但是除了堆栈中的前三项之外,其他所有内容都只能<integer>$复制第n项。使用类似PostScript的roll命令将很有用,这样可以轻松处理三个以上的“实时”变量。

理想情况下,将有一个1-arg和两个-arg版本,但是如果周围没有足够的名称,则一个-arg应该优先使用一个一个字符。

一个参数一的参数只是要滚动的项目数。例如1 roll,什么都不做;2 roll等价于\; 3 roll等价于@; 4 roll对于更高的数字,则没有现有的等效项;最接近的可能是

]-4/()\+\+[]*-1%~

(这甚至不能处理堆栈上某些位置或active上的非整数[,并且几乎肯定也会在循环内中断)。

两个参数也需要花费一定的时间;a b roll2等同于{a roll}b*


因此,就像Ruby的一样rotate。您应该将其编辑为CW答案。
门把手

@门把手,不。我说的是在堆栈的一部分而不是数组上进行操作。
彼得·泰勒

嗯...我不确定你的意思。我对后记不熟悉,但是roll只是旋转数组,对吧?
门把手

@DoorknobofSnow,堆栈。数组是放在堆栈上的项目。
彼得·泰勒

哦,所以它旋转了整个堆栈。嗯,可能有用!+1
门把手

8

贾姆

我已经实现了“改进的GolfScript”,它被称为CJam- http: //sf.net/p/cjam
现在在第二个发行版(0.6版)中,它已经具有此处讨论的许多功能(如果不是大多数的话)。我将尝试列出它们:

  • 仍然用Ruby编写-不,java
  • 使用`作为字符串分隔符-不,但它使用双引号字符串以最小的逃逸(\逃逸只\"
  • 浮点-受支持,但仅标准“双精度”,不具有任意精度
  • 将类型转换为其他类型-是
  • 正则表达式-尚未,但已计划;将使用带有特殊运算符的常规字符串
  • 文件和日期对象-否,但可以获取当前日期/时间
  • 哈希-假设它们像python dict或java maps,则不支持它们(将来可能会考虑)
  • 辅助功能可以做的更多-是的,很多
  • `http://example.com`net -- "example.com"g
  • 将字符串作为Ruby代码执行-不
  • 无可奉告-确切地说,#用于其他用途,"comments like this";
  • 更容易添加功能-我认为是这样,但我也有偏见:)
  • 在Github上-甚至更好(我认为,请不要射击)-在SourceForge上使用hg
  • 在麻省理工学院获得许可-是
  • 没有最后的换行符-对
  • 随机- mr
  • tr- er
  • 样本-未完成, _,mr=
  • 展平-尚未完成,但可能更容易实现
  • 糊涂-不,但是标识符不需要分开
  • 调试-仅堆栈跟踪,以及ed用于显示堆栈的运算符

  • 灵活的I / O-是,但显式输入

  • 较短的内置插件-是,b=基本,z=拉链
  • 单独的前导0-否,但可以使用预定义变量
  • 消除歧义--是的,但不是_1 2-3-> 1 2 -3; 1 2m3->-1 3
  • 滚动/旋转堆栈-不
  • 数组集- t
  • divmod- md
  • 更改词法分析器(用于标识符)-是的,下面有更多内容
  • 笛卡尔积-不完全相同,但是, m*
  • Unicode运算符-否
  • 单字符标识符-预定义的运算符具有1或2个字符,变量是单字符大写字母;它们都可以串联在一起而不会混淆词法分析器/解析器
  • 运算符-否
  • 稳定排序-是
  • 将符号转回代码块-否,但稍后可能会添加
  • 当前日期/时间- et
  • 命令行参数- ea
  • 清楚地分隔内置函数-是的,但大写字母是变量;内置是或以小写和特殊字符开头
  • 最小值和最大值-是,当前仅适用于2个值:e<e>
  • 绝对值- z(GolfScript具有abs,不缺乏)
  • 数组的总和与乘积- :+:*
  • 曼哈顿距离-不
  • chr- c(转换为字符,而不是字符串)
  • 将字符串溢出到堆栈上-CJam字符串由字符而不是数字组成;洒了字符,它仍然{}/
  • 一个版本:会消耗存储的内容-不
  • >=<=-不,使用<!,的运算符>!
  • base64和zlib-不
  • 1 $,2 $,3 $,4 $,5 $的快捷方式-不
  • 复制计划中的前两个堆栈项目;现在使用1$1$
  • 局部变量-不
  • HQ9 +功能-不,谢谢

CJam具有更多功能,请查看https://sourceforge.net/p/cjam/wiki/Operators/


7
我不同意SourceForge和Mercurial优于GitHub。
nyuszika7h 2014年

1
@ nyuszika7h没关系,我们都有我们的偏爱
aditsu退出是因为SE无效2014年

我刚刚发布了我的第一个CJam答案,因为我的GolfScript答案非常需要适当的sqrt函数。CJam比GolfScript快很多!
丹尼斯


@aditsu您会认为CJam是GolfScript的方言还是受GolfScript启发的新语言?(这就是我问的原因:codegolf.stackexchange.com/questions/37464/…
Martin Ender

6

更改词法分析器

GolfScript的词法分析器将Ruby标识符(与regex匹配的任何东西[_a-zA-Z][_a-zA-Z0-9]*)都视为单个令牌。如果改为将其[a-zA-Z]+视为令牌,则可以将其释放_为内置令牌,并允许在alpha变量后跟文字整数,而无需分隔空格。


好吧,目前我只是使用[a-z]+|[A-Z]+,进行下划线,因此下划线是免费的。但是,这是一个有趣且非常独特的想法!+1
门把手

5

Unicode别名

多字符命令可以具有unicode别名。当分数以字符而非字节计数时,这将节省分数。


7
呃...我们不要另一个APL ...
John Dvorak

1
Golfscript与APL,Unicode或其他都不一样。我们已经有其他几个APL,例如J和K。(甚至R看起来对我来说都是APL的启发,以至于您可以经常进行文字翻译)
marinus 2013年

关于APL的区别在于,它使用的字符集与其他字符集完全不同,而不是它本身使用矢量算法。我喜欢J,我用它,我通常会投票给J答案。我尚未对一个 APL答案表示赞同。如果我想绘制程序而不是编写程序,则可以使用Piet。
John Dvorak 2013年

我认为APL比J更清晰,当然也比Golfscript更清晰。
marinus 2013年


5

数组集运算符

["A" "B" "C" "D" "E" "F"] -1 4 S    # -> ["A" "B" "C" "D" -1 "F"]

我们可以提供任何内置功能吗?


+1我开始写有关实现数组集的博客文章,但从未完成。目前,要全面推广,这非常困难。这将对某些挑战产生重大影响。
彼得·泰勒

我不敢相信这还没有内置在golfscript中。+1
门把手

5

单字符标识符

这不像代码高尔夫解决方案会包含太多变量。这样可以节省空间。


嗯..这也可以通过更改解析器来完成。也许是一个标志来指定这种行为?好想法!+1
门把手


3

正则表达式支持

缺少正则表达式支持一直使我感到惊讶,这是一种专为打高尔夫球而设计的语言。拥有它会很棒

  • <string> <string> <string> y(又名tr,使用Perl的一字符别名)
  • <string> <string> <string> s (替代)
  • <string> <string> <block> s (用回调代替)
  • <string> <string> m (比赛)

我已经在问题中提到了正则表达式。
门把手


3

使|,&和^内置函数对块有用

例如<array/string> <block> |可以用作索引函数

[0 -10 -20 30 40 -50 60] {0<} |   # -> [1 2 5]

有什么想法<array/string> <block> &<array/string> <block> ^


是什么array block =现在怎么办?
John Dvorak

@JanDvorak比较。如果要将字符串与块进行比较,则很有用,例如"0<" {0<} =
霍华德

您多久需要一次?我宁愿删除它,并使用array block =“按谓词选择”
John Dvorak

@JanDvorak谓词选择已使用来实现,
霍华德

哦,没关系。继续:-)
约翰·德沃夏克

2

一种将符号变回代码块的方法

当前,我们可以使用来将代码块绑定到符号:,但是无法逆转该过程:执行绑定到代码块的符号只会执行该块。

我可以看到几种实现此目的的方法:

  1. 添加新的语法,例如#foo将的值压入foo堆栈,即使它是代码块也是如此,或者

  2. 添加一个运算符以扩展代码块中的每个符号,以便(_用作新运算符)例如{2*}:dbl; {dbl dbl}_产生{2* 2*}

我可以看到两种方法的优点。后者可以代替前者,但要花两个额外的字符({foo}_而不是#foo),但是我可以看到前者语法的某些潜在应用,其中这两个字符是禁止的(例如,使用array #func %代替array {func} %)。

同时,如果有一种方便的方法可以迭代代码块中的令牌,可以使用前一种语法来替换后者(无论如何它本身可能是有用的)。


无论哪种情况,我都建议绑定到本机内置组件(即,在Ruby代码中实现)的扩展符号应返回某种存根,可以调用该存根以获得内置函数,但不可能或只是不太可能被覆盖。例如#$(或{$}_)可以返回例如{builtin_dollar},其中builtin_dollar将包含$内置的实际实现(并且#builtin_dollar{builtin_dollar}_应仅返回{builtin_dollar}自身)。

这将允许重新定义内置函数而不会失去对其功能的访问(请参阅我先前的建议),因此,如果我出于某种原因想要交换$and 的含义@,我可以做#$ #@ :$; :@;(或{$}_ {@}_ :$; :@;)。


我不确定的一个细节是,_如果代码块包含变量分配,操作员应该怎么做。显而易见的事情是不修改任何:symbol标记并扩展其他任何内容,但这将导致_使用局部变量破坏任何代码。但是,使其中断这样的代码可能是不切实际的复杂。
Ilmari Karonen 2014年

1
您的第二个版本将与数组上的flatten运算符配合使用[[1] [2] [3]] _ -> [1 2 3]
霍华德

那么,结果将是什么2:A;{1:A;A}_
霍华德

天真{1:A;2}{1:A builtin_semicolon 2}如果包含内置扩展功能,则为技术性)。如果包含某种“局部变量排除”功能,则可能将其评估为just {1:A;A}
Ilmari Karonen 2014年

还是要更技术{builtin_1 :A builtin_semicolon 2}
霍华德

1

带有命令行参数的变量预设

不幸的是,没有任何未分配的字符,但是也许我们可以使用A它?


_可用。也许那?无论如何,是的,golfscript需要一种获取cmd线args +1的方法
Doorknob

0

我应该实现的本机Ruby函数

这是社区维基;随时编辑和添加您认为我应该实现的功能!

格式:“ nativeFunctionNamenameInMyLanguage)”

  • shufflesf
  • trtr
  • samplesm

0

也可以使用APL和HQ9 +的功能!

  • 快捷方式,例如在APL中。编辑:刚刚看到答案“ unicode别名”。我正是这个意思 :)
  • 其他面向高尔夫的快捷方式,例如H9 +,HQ9 +,CHIQRSX9 +

好吧,那你怎么提出呢?有什么具体想法吗?
门把手

unicode字符允许仅用一个字符完成复杂的操作。
xem

@ Snow的@Doorknob,我用想要的快捷方式更新了我的答案:来自APL的快捷方式和来自CHIRQSX9 +的快捷方式:)
xem 2013年

嗯,hq9 +的东西似乎太骗人了:-P
门把手

以高尔夫为导向:我认为您的语言至少也应该如此:)
xem

0

明确分离内置

例如首都:内置; 使B为基础可行


1
如上所述,不需要分开。如果有人喜欢覆盖内置文件,那么他应该可以这样做。我什至发现了覆盖诸如的运算符的有用应用程序{-}:+
霍华德

不需要,这种语言也不区分大小写。
门把手

2
由于目标是提供每个孔更少的行程,因此,具有区分大小写和更多内置功能的功能可以有效地完成任务陈述。

0

局部变量/闭包

我在GolfScript中真正想念的一件事是能够临时更改符号的值

特别是,目前没有办法暂时覆盖内置的“原始”含义:一旦您重新定义了$,就永远不会再对该程序进行任何排序。(嗯,至少不是没有编写自己的sort实现。)例如,可以说此代码块中有 $其他含义,但仍将其正常含义保留在其他地方确实很不错。

与上述相关,将代码块中的符号绑定到它们的当前值会很好。当然,我可以写,说,{$-1%}:rsort并且能够使用rsort排序和扭转数组,但工作只是只要定义$(或-1%)不会改变,因为我的rsort功能仍然调用全局符号$。能够说“让我们rsort做什么$-1%,即使以后重新定义这些符号也将是一件很不错的事”。

特别是,标准库可以使用这种绑定。意识到改变意味着n改变了行为puts,或者重新定义!完全弄乱了,这真是令人惊讶xor。(再一次,这里应该谨慎行事,因为特别地,改变puts事实的能力被证明是避免在当前版本的GS中打印最终换行符的唯一方法。)

编辑:能够将符号转换回代码块将大大有助于实现此功能。特别是,该{foo}_答案中建议的语法将通过扩展代码块中的所有符号来有效地执行一级静态绑定。结合使用Fixpoint组合器进行深度静态绑定,Bob是您的叔叔...


快来吧-所有花哨的新语言都会庆祝懒惰的评估;-)让我们在GolfScript中保留该功能。
霍华德

再次考虑-您是对的,它更多的是绑定而不是评估。但是,静态绑定比听起来要复杂得多,例如,在定义内提供递归调用。
2014年

“ 即使以后重新定义了这些符号,也rsort请执行$-1%当前的操作”那么Emmental?
CalculatorFeline'3

0

更多内置功能

使所有单字母变量az和AZ执行一些通用的有用功能。缺少一些内置功能:

  • 最小值和最大值:整个数组中前2个堆栈值的全部或部分,前n个堆栈值
  • 绝对值
  • 数组的总和与乘积。为什么什么{+}*时候可以做S?您可以在这里使用52个功能!
  • 曼哈顿距离(即x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)。现在必须是@-A@@-A+如果A是一个内置的绝对值。当然,这只是我最近的帖子的提示,但我一直认为这是扩展golfscript的好方法:写下什么函数很容易拥有,收集并添加为内置函数。
  • 将整数转换为一个单字符字符串(等同于python的chr)。
  • 将字符串溢出到堆栈上(当前为{}/
  • 该版本:消耗存储的内容。这不必使标识符“卡住”才有用。
  • 的运算符>=<=
  • 正如有人建议的那样,一种无需执行就将包含块的变量放入堆栈的方法。所以,你可以降低形式的IFS 1{\}{|}if喜欢的东西1?\?|if
  • 内置的base64转换和zlib支持,使嵌入数据所需的字符更少
  • 在base64之外,进行自定义的base93编码(使用不是字符串定界符的所有可打印字符)。
  • 快捷键1$2$3$4$5$
  • 操作员按原样复制最上面的两个堆栈项目,即 \.@.@\

-3

如果自动返回在函数的最后一行中写入或计算的值,那将是很好的


3
它是基于堆栈的,所以...
marinus 2013年

1
没有功能。
彼得·泰勒

函数不返回任何内容……它们被称为块
Doorknob

可能不错……用其他语言。(在函数末尾不再有烦人的return语句!是的!(但是我从来没有需要return语句,所以...))
CalculatorFeline
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.