Я планирую написать улучшенный GolfScript для еще более коротких программ, которые могут делать больше вещей. Это не проблема; это запрос обратной связи и советы о том, что я должен делать. (см. теги)
Я не уверен, должно ли это быть вики сообщества. Если вы так думаете, просто отметьте модератора, чтобы преобразовать его :)
Этот язык будет очень похож на GolfScript. Это все еще написано на Ruby. Тем не менее, он имеет несколько отличий:
- Использование
`
в качестве разделителя строк, потому что это необычный символ, поэтому потребуется меньше экранирования. (Другой персонаж может заменить свою функцию, например#
(подробнее об этом позже)).\`
избежать\\
обратной черты, избежать обратной косой черты, и нет других escape-последовательностей. Если вам нужна новая строка, просто вставьте фактическую буквальную новую строку в строку. - Использование Ruby's
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 символов ),sample
(sm
ранее.,rand=
),flatten
(fl
ранее ???) и т. Д. - Это будет затушевано, как Ребму. Например, теперь вы можете сделать
~:a0<{0a-}aIF
(используя буквенное имя переменной) вместо~:$0<{0$-}$if
(перезаписав функцию сортировки). (пример отсюда ). Обратите внимание, что в этом случае регистр не учитывается, а числа не допускаются в именах переменных. На мой взгляд, это нормально, так как это язык для игры в гольф: P - Это будет иметь отладку. Я добавлю возможность указывать флаг, определяющий разделители массива, разделители элементов и т. Д., Вывод чисел (рациональный, с плавающей запятой или int?), Пошаговое выполнение инструкций по одному, токенизацию и вывод каждого токена вместо запуска программы, и т.п.
Итак, мой вопрос: что тут улучшать? Как вы думаете, я должен добавить?
Любые другие идеи для этого, прежде чем я начну его кодировать?
code-golf
tips
golfscript
Doorknob
источник
источник
Ответы:
Гибкий ввод / вывод
Golfscript в настоящее время не может быть использован для интерактивных программ. Я предлагаю некоторые функции для явного ввода быть добавлены (например
readline
,getchar
и друзьями). Интерпретатор должен увидеть, использует ли программа их перед запуском.Если программа не вызывает никаких функций ввода, интерпретатор должен вести себя так, как обычно делает Golfscript.
Я не ожидал бы, что интерпретатор обнаружит входные функции в eval'-коде, сгенерированном во время выполнения, но если он каким-то образом это сделает, слава.
источник
Более короткие встроенные модули
Односимвольные псевдонимы для всех встроенных команд, у которых их нет. Я бы использовал
base
намного больше, если бы это было простоB
.источник
b
в качестве имени переменной? Все еще; хорошая идея; вы просто помните, что не следует использовать это имя, если вы собираетесь использовать функцию, и если вы не используете эту функцию, то это не влияет на вас вообще.^
или$
) в качестве имен переменных. Это не усугубляет эту проблему. Кроме того, я предложил псевдонимы для обеспечения обратной совместимости, поэтому вам просто нужно будет использовать более длинное имя, если вы назначите что-то другое для более короткого псевдонима.Z
дляzip
также будет очень полезно.#include
и"#{IO.read'lib'}"~
слишком долго).mylang -Llibname somefile.ext
.Комбинированный div-мод
Это немного больше , чем ниша некоторые из предложений, но при работе на теоретико-числовых программы , которые я часто ловлю себя на желании операции , которая выскакивает два целых число
a
иb
из стека и толчковa/b
иa%b
. (На данный момент это так1$1$/@@%
).источник
dvm
DiV-Mod. Спасибо за все идеи :-) +1чисел
Измените лексер так, чтобы ведущий 0 не был частью числа:
Также отрицательные числа должны быть записаны
_
вместо:источник
0 100-
отрицательной 100. +1~
. Например -1 есть0~
. Это делает небольшое количество чисел длиннее на один символ, но устраняет умеренно частую потребность в пробелах после-
.{0\-}:~;
(~
отрицательное число) и использоватьnot
для побитового (просто какand or xor
)?Доступ ко всему стеку
GolfScript является основанным на стеке языком, но доступ ко всем, кроме трех верхних элементов в стеке, ограничен
<integer>$
копированием n-го элемента. Было бы полезно иметь что-то вроде команды PostScript,roll
чтобы было легче работать с более чем тремя «живыми» переменными.В идеале должны быть версии с одним аргументом и с двумя аргументами, но если вокруг недостаточно имен, то один аргумент должен получить предпочтение односимвольному.
One-arg one просто берет количество предметов для броска. Например
1 roll
, ничего не делает;2 roll
эквивалентно\
;3 roll
эквивалентно@
;4 roll
а для больших чисел не существует существующего эквивалента; самое близкое, что возможно, это что-то вроде(и это даже не обрабатывает нецелые числа в определенных позициях в стеке или активно
[
, и почти наверняка также разрывает внутри циклов).Двухаргументный также берет сумму, чтобы катиться;
a b roll2
эквивалентно{a roll}b*
.источник
rotate
. Вы должны отредактировать это в ответе CW.roll
просто вращаю массив, верно?CJam
Я реализовал «улучшенный GolfScript», и он называется CJam - http://sf.net/p/cjam.
Теперь во втором выпуске (версия 0.6) в нем уже есть многие, если не большинство функций, обсуждаемых здесь. Я постараюсь перечислить их:
`
в качестве разделителя строк - нет, но он использует строки в двойных кавычках с минимальным экранированием (\
только экранирование\
и"
)`http://example.com`net
-"example.com"g
#
используется для чего-то другого,"comments like this";
mr
er
_,mr=
отладка - только трассировки стека и
ed
оператор для отображения стекагибкий ввод / вывод - да, но только явный ввод
b
= база,z
= почтовый индекс-
- да, но не с_
;1 2-3
->1 2 -3
;1 2m3
->-1 3
t
md
m*
et
ea
e<
,e>
z
(GolfScript имеетabs
, не хватает):+
,:*
c
(конвертируется в символ, а не в строку){}/
:
которая потребляет то, что хранится - нет>=
,<=
- Нет, использовать<!
,>!
1$1$
У CJam гораздо больше возможностей, посмотрите https://sourceforge.net/p/cjam/wiki/Operators/
источник
Поменять лексер
Лексер GolfScript рассматривает идентификатор Ruby (все, что соответствует регулярному выражению
[_a-zA-Z][_a-zA-Z0-9]*
) как один токен. Если вместо этого он обрабатывается[a-zA-Z]+
как токен, он_
может быть встроенным и позволять за альфа-переменной следовать буквальное целое число без разделения пробелов.источник
[a-z]+|[A-Z]+
, для того, чтобы взбодриться, поэтому подчеркивание бесплатно. Это интересная и очень уникальная идея! +1Юникод псевдонимы
Многосимвольные команды могут иметь псевдонимы Unicode. Это сэкономит на счете, когда счет засчитывается в символах, а не в байтах.
источник
Стабильный сорт
$
Встроенный на блоки должны выполнить стабильную сортировку.источник
Оператор набора массивов
Любое встроенное мы можем сделать доступным для этого?
источник
Односимвольные идентификаторы
Это не значит, что в кодовом решении для гольфа будет слишком много переменных. И это сэкономит на пространствах.
источник
% как встроенный для продукта
источник
Поддержка регулярных выражений
Отсутствие поддержки регулярных выражений всегда казалось мне странным в языке, предназначенном для игры в гольф. Было бы здорово иметь
<string> <string> <string> y
(он жеtr
использует псевдоним Perl для одного символа)<string> <string> <string> s
(замена)<string> <string> <block> s
(заменить обратным вызовом)<string> <string> m
(совпадение)источник
Встроенные функции для текущей даты / времени
В настоящее время очень странно, чтобы получить дату / время, используя Ruby evals.
источник
Встроенные модули |, & и ^ делают что-то полезное для блоков
Например,
<array/string> <block> |
можно использовать в качестве индексной функцииЕсть идеи для
<array/string> <block> &
или<array/string> <block> ^
?источник
array block =
теперь делать?"0<" {0<} =
.array block =
для «выбора по предикату»,
.Способ превратить символы обратно в блоки кода
В настоящее время мы можем связать блоки кода с символами
:
, но нет способа полностью изменить процесс: выполнение символа, привязанного к блоку кода, просто выполняет блок.Я вижу несколько способов реализовать это:
добавить новый синтаксис, например,
#foo
передать значениеfoo
в стек, даже если это блок кода, илидобавьте оператор, чтобы развернуть каждый символ в блоке кода, чтобы (например, используя
_
в качестве нового оператора), например, получилось{2*}:dbl; {dbl dbl}_
бы{2* 2*}
.Я вижу преимущества обоих методов. Последний мог бы заменить первый за счет двух дополнительных символов (
{foo}_
вместо#foo
), но я вижу некоторые потенциальные приложения для первого синтаксиса, где эти два символа были бы запретительными (например, использованиеarray #func %
вместоarray {func} %
).Между тем, первый синтаксис можно использовать для замены второго, если есть удобный способ как-то перебирать токены в блоке кода (который в любом случае может быть полезен сам по себе).
В любом случае я бы предложил, чтобы расширяющиеся символы, которые привязаны к встроенным встроенным модулям (то есть реализованным в коде Ruby), возвращали какую-то заглушку, которая могла бы быть вызвана для получения функциональности встроенной функции, хотя это либо невозможно или просто вряд ли будет отменено. Например
#$
(или{$}_
) может возвращать, например{builtin_dollar}
, гдеbuiltin_dollar
будет содержать фактическую реализацию$
встроенного (и#builtin_dollar
или{builtin_dollar}_
должен просто вернуть{builtin_dollar}
сам).Это позволило бы переопределять встроенные модули без потери доступа к их функциям (см. Мое предыдущее предложение ), поэтому, если бы я, скажем, по какой-то причине захотел поменять местами значения
$
и@
, я мог бы просто сделать#$ #@ :$; :@;
(или{$}_ {@}_ :$; :@;
).источник
_
должен делать оператор, если блок кода содержит назначения переменных. Очевидная вещь состоит в том, чтобы просто оставить любые:symbol
токены нетронутыми и расширить что-либо еще, но это приведет_
к поломке любого кода с использованием локальных переменных. Однако сделать так, чтобы он не нарушал такой код, было бы непрактично сложно.[[1] [2] [3]] _ -> [1 2 3]
.2:A;{1:A;A}_
?{1:A;2}
(или, если быть технически,{1:A builtin_semicolon 2}
если была включена встроенная функция расширения). Если бы была включена какая-то особенность «исключения локальных переменных», она могла бы быть оценена как правдоподобная{1:A;A}
.{builtin_1 :A builtin_semicolon 2}
.Предустановка переменной с аргументами командной строки
К сожалению, ни один символ не остался неназначенным, но, может быть, мы можем использовать
A
для этого?источник
_
доступен. Возможно это? В любом случае, да, для golfscript нужен способ получения аргументов cmd line +1Собственные функции Ruby, которые я должен реализовать
Это вики сообщества; не стесняйтесь редактировать и добавлять функции, которые вы должны реализовать!
Формат: "
nativeFunctionName
(nameInMyLanguage
)"shuffle
(sf
)tr
(tr
)sample
(sm
)источник
Используйте функции APL и HQ9 +!
источник
Четко разделяющие встроенные модули
например, столицы: встроенные модули; делая B для базы осуществимой
источник
{-}:+
.Локальные переменные / замыкания
Одна вещь, которую мне действительно не хватает в GolfScript, - это возможность временно изменить значение символа .
В частности, в настоящее время нет способа временно переопределить значение встроенного «примитива»: как только вы, скажем, переопределите
$
, вы никогда больше не будете ничего сортировать в этой программе. (Ну, по крайней мере, не без написания вашей собственной реализации сортировки.) Было бы очень приятно, например, сказать, что в этом блоке кода$
есть что-то другое, но все же следует сохранить нормальное значение в другом месте.В связи с вышеизложенным было бы неплохо связать символы в блоке кода с их текущим значением . Конечно, я могу писать, скажем,
{$-1%}:rsort
и иметь возможность использоватьrsort
для сортировки и обращения массив, но это работает только до тех пор, пока определение$
(или-1
или%
) не изменится, поскольку мояrsort
функция все еще вызывает глобальный символ$
. Было бы неплохо иметь возможность сказать: «Давайтеrsort
делать то, что в$-1%
данный момент делает, даже если эти символы будут позже переопределены».В частности, стандартная библиотека может использовать этот тип привязки. Довольно удивительно осознавать, что, скажем, изменение
n
меняет поведениеputs
или что переопределение!
полностью портитxor
. (Опять же, здесь следует проявлять некоторую осторожность, поскольку, в частности, способность изменить поведениеputs
оберток оказывается единственным способом избежать печати окончательного перевода строки в текущей версии GS.)Редактирование: возможность превращать символы обратно в блоки кода будет иметь большое значение для реализации этой функциональности. В частности,
{foo}_
синтаксис, предложенный в этом ответе, будет эффективно выполнять один уровень статической привязки путем расширения всех символов в блоке кода. Объедините это с комбинатором с фиксированной точкой для глубокого статического связывания, и Боб станет вашим дядей ...источник
rsort
делать то, что в$-1%
данный момент делает, даже если эти символы позже переопределены" Итак, Эмменталь?Больше встроенных функций
Сделайте так, чтобы все однобуквенные переменные az и AZ выполняли какую-то общую полезную функцию. Некоторые встроенные модули, которые отсутствуют:
{+}*
когда можно сделатьS
? У вас есть 52 функции для работы здесь!x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)
. Е. Теперь это должно быть,@-A@@-A+
еслиA
это встроенная абсолютная величина. Конечно, это только из соображений моего последнего поста, но я всегда полагал, что это был бы хороший способ расширить сценарий гольфа: запишите, что Было бы удобно иметь функции, собирать их и добавлять их как встроенные.chr
).{}/
):
которая потребляет то, что хранится. Это должно было бы не застрять в идентификаторах, чтобы быть полезным.>=
,<=
1{\}{|}if
до чего-то вроде1?\?|if
1$
,2$
,3$
,4$
,5$
\.@.@\
источник
Было бы хорошо, если бы значение, записанное или вычисленное в последней строке функции, было автоматически возвращено
источник