Улучшенная версия GolfScript [закрыто]

12

Я планирую написать улучшенный 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?), Пошаговое выполнение инструкций по одному, токенизацию и вывод каждого токена вместо запуска программы, и т.п.

Итак, мой вопрос: что тут улучшать? Как вы думаете, я должен добавить?

Любые другие идеи для этого, прежде чем я начну его кодировать?

Doorknob
источник
Поймите, что если вы добавляете гриб, вы теряете чувствительность к регистру.
Маринус
@marinus Я понимаю это. Я должен был прояснить это; редактирование ...
Дверная ручка
Также то, что ему действительно нужно, это способ сделать явный ввод / вывод (для интерактивных программ). Интерпретатор может заранее проверить, использует ли программа явный ввод-вывод, и только неявный ввод-вывод, если это не так.
Маринус
@marinus Отлично, вы должны добавить это как ответ :)
Дверная ручка
1
@Claudiu Моя работа над моим новым языком довольно живая, хотя в последнее время я был довольно занят, поэтому немного поработал над этим. Некоторые из этих идей просто не очень хорошие идеи, которые я не использую: P
дверная ручка

Ответы:

17

Гибкий ввод / вывод

Golfscript в настоящее время не может быть использован для интерактивных программ. Я предлагаю некоторые функции для явного ввода быть добавлены (например readline, getcharи друзьями). Интерпретатор должен увидеть, использует ли программа их перед запуском.

Если программа не вызывает никаких функций ввода, интерпретатор должен вести себя так, как обычно делает Golfscript.

Я не ожидал бы, что интерпретатор обнаружит входные функции в eval'-коде, сгенерированном во время выполнения, но если он каким-то образом это сделает, слава.

Мэринус
источник
Эта великолепная идея; Ограниченное число - одно из больших ограничений. +1
дверная ручка
11

Более короткие встроенные модули

Односимвольные псевдонимы для всех встроенных команд, у которых их нет. Я бы использовал baseнамного больше, если бы это было просто B.

Питер Тейлор
источник
Но что, если вы используете bв качестве имени переменной? Все еще; хорошая идея; вы просто помните, что не следует использовать это имя, если вы собираетесь использовать функцию, и если вы не используете эту функцию, то это не влияет на вас вообще.
Ручка двери
@DoorknobofSnow, вы уже можете использовать встроенные модули (и даже токены, такие как ^или $) в качестве имен переменных. Это не усугубляет эту проблему. Кроме того, я предложил псевдонимы для обеспечения обратной совместимости, поэтому вам просто нужно будет использовать более длинное имя, если вы назначите что-то другое для более короткого псевдонима.
Питер Тейлор
4
Zдля zipтакже будет очень полезно.
Говард
Может быть, мы сможем выпустить официальную стандартную библиотеку для GolfScript. Но мне неясно, как это можно включить в решения (отсутствует #includeи "#{IO.read'lib'}"~слишком долго).
Говард
@Howard Теперь это идея ... Я мог бы добавить библиотеки на свой язык, может быть, как mylang -Llibname somefile.ext.
Дверная ручка
9

Комбинированный div-мод

Это немного больше , чем ниша некоторые из предложений, но при работе на теоретико-числовых программы , которые я часто ловлю себя на желании операции , которая выскакивает два целых число aи bиз стека и толчков a/bи a%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чтобы было легче работать с более чем тремя «живыми» переменными.

В идеале должны быть версии с одним аргументом и с двумя аргументами, но если вокруг недостаточно имен, то один аргумент должен получить предпочтение односимвольному.

One-arg one просто берет количество предметов для броска. Например 1 roll, ничего не делает; 2 rollэквивалентно \; 3 rollэквивалентно @; 4 rollа для больших чисел не существует существующего эквивалента; самое близкое, что возможно, это что-то вроде

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

(и это даже не обрабатывает нецелые числа в определенных позициях в стеке или активно [, и почти наверняка также разрывает внутри циклов).

Двухаргументный также берет сумму, чтобы катиться; a b roll2эквивалентно {a roll}b*.

Питер Тейлор
источник
Итак, как у Руби rotate. Вы должны отредактировать это в ответе CW.
Дверная ручка
@ Doorknob, нет. Я говорю о работе с фрагментом стека, а не с массивом.
Питер Тейлор
Ммм ... Я не уверен, что ты имеешь в виду. Я не знаком с postscript, но rollпросто вращаю массив, верно?
Дверная ручка
@ DoorknobofSnow, стек . Массив - это элемент, который помещается в стек.
Питер Тейлор
О, так это вращает весь стек . Ах, это может быть полезно! +1
дверная ручка
8

CJam

Я реализовал «улучшенный GolfScript», и он называется CJam - http://sf.net/p/cjam.
Теперь во втором выпуске (версия 0.6) в нем уже есть многие, если не большинство функций, обсуждаемых здесь. Я постараюсь перечислить их:

  • до сих пор написано на Ruby - Нет, Java
  • использование `в качестве разделителя строк - нет, но он использует строки в двойных кавычках с минимальным экранированием ( \только экранирование \и ")
  • с плавающей точкой - поддерживается, но только стандартная «двойная», не произвольная точность
  • конвертировать типы в другие типы - да
  • регулярные выражения - пока нет, но запланировано; будет использовать обычные строки со специальными операторами
  • Объекты File и Date - нет, но могут получить текущую дату / время
  • хэши - если они похожи на python dicts или java-карты, то они не поддерживаются (возможно, в будущем)
  • вспомогательные функции, чтобы сделать еще больше - да, много
  • `http://example.com`net - "example.com"g
  • выполнить строку как код Ruby - нет
  • без комментариев - точно, #используется для чего-то другого,"comments like this";
  • проще добавлять функции - я так думаю, но я тоже предвзятый :)
  • на Github - даже лучше (на мой взгляд, пожалуйста, не стреляйте) - на SourceForge, используя hg
  • по лицензии MIT - да
  • окончательного перевода строки нет - верно
  • перемешать - mr
  • tr - er
  • образец - не сделано, _,mr=
  • сгладить - не сделано, но, вероятно, легче достичь
  • mushed - нет, но идентификаторы не нужно разделять
  • отладка - только трассировки стека и edоператор для отображения стека

  • гибкий ввод / вывод - да, но только явный ввод

  • более короткие встроенные модули - да, b= база, z= почтовый индекс
  • отдельный ведущий 0 - нет, но может использовать предопределенные переменные
  • однозначно -- да, но не с _; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • свернуть / повернуть стопку - Нет
  • набор массивов - t
  • divmod - md
  • изменить лексер (для идентификаторов) - да, подробнее ниже
  • декартово произведение - не совсем то же самое, но да, m*
  • операторы Юникода - нет
  • односимвольные идентификаторы - предопределенные операторы имеют 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/

уйти, потому что SE это зло
источник
7
Я не согласен с тем, что SourceForge и Mercurial лучше, чем GitHub.
nyuszika7h
1
@ nyuszika7h все нормально, у всех нас есть свои предпочтения
адицу ушел, потому что SE ЗЛО
Я только что опубликовал свой самый первый ответ CJam , потому что мой ответ на GolfScript остро нуждался в правильной функции sqrt. CJam намного быстрее, чем GolfScript!
Деннис
@Dennis Awesome :)
адицу ушел, потому что SE это ЗЛО
@aditsu Считаете ли вы CJam диалектом GolfScript или новым языком, вдохновленным GolfScript? (Вот причина, по которой я спрашиваю: codegolf.stackexchange.com/questions/37464/… )
Мартин Эндер
6

Поменять лексер

Лексер GolfScript рассматривает идентификатор Ruby (все, что соответствует регулярному выражению [_a-zA-Z][_a-zA-Z0-9]*) как один токен. Если вместо этого он обрабатывается [a-zA-Z]+как токен, он _может быть встроенным и позволять за альфа-переменной следовать буквальное целое число без разделения пробелов.

Питер Тейлор
источник
Ну, в настоящее время я использую просто [a-z]+|[A-Z]+, для того, чтобы взбодриться, поэтому подчеркивание бесплатно. Это интересная и очень уникальная идея! +1
дверная ручка
5

Юникод псевдонимы

Многосимвольные команды могут иметь псевдонимы Unicode. Это сэкономит на счете, когда счет засчитывается в символах, а не в байтах.

Мэринус
источник
7
э-э ... мы не хотим еще одну APL ...
Джон Дворжак
1
Golfscript не похож на APL, Unicode или нет. У нас уже есть несколько других APL, таких как J и K. (или даже R, который мне кажется достаточно вдохновленным APL, до такой степени, что вы можете делать буквальные переводы довольно часто)
marinus
Отличительной чертой APL является то, что он использует совершенно другую кодировку, чем что-либо еще, а не то, что он использует векторную арифметику изначально. Мне нравится J, я использую его, и я обычно приветствую J ответы. Я еще не проголосовал за один ответ APL. Если бы я хотел писать свои программы вместо того, чтобы писать их, я бы использовал Piet.
Джон Дворжак
Я думаю, что APL более разборчивый, чем J, конечно, более разборчивый, чем Golfscript.
Маринус
5

Стабильный сорт

$Встроенный на блоки должны выполнить стабильную сортировку.

Говард
источник
5

Оператор набора массивов

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

Любое встроенное мы можем сделать доступным для этого?

Говард
источник
+1 Я начал писать в блоге о реализации набора массивов, но так и не закончил. В настоящее время это чрезвычайно сложно в полной общности. Это имело бы большое значение для некоторых проблем.
Питер Тейлор
Я не могу поверить, что это уже не встроено в golfscript. +1
дверная ручка
5

Односимвольные идентификаторы

Это не значит, что в кодовом решении для гольфа будет слишком много переменных. И это сэкономит на пространствах.

Джеймс Вуд
источник
Хм .. Это также можно сделать, изменив парсер. Возможно флаг, чтобы указать это поведение? Отличная идея! +1
дверная ручка
4

% как встроенный для продукта

[1 2][1 2 3]%  # -> [[[1 1][1 2][1 3]][[2 1][2 2][2 3]]]
Говард
источник
+1; Вы можете отредактировать мой CW ответ и добавить этот
Ручка
Что по модулю?
MilkyWay90
3

Поддержка регулярных выражений

Отсутствие поддержки регулярных выражений всегда казалось мне странным в языке, предназначенном для игры в гольф. Было бы здорово иметь

  • <string> <string> <string> y(он же trиспользует псевдоним Perl для одного символа)
  • <string> <string> <string> s (замена)
  • <string> <string> <block> s (заменить обратным вызовом)
  • <string> <string> m (совпадение)
Питер Тейлор
источник
Я уже упоминал регулярное выражение в моем вопросе.
Ручка двери
3

Встроенные функции для текущей даты / времени

В настоящее время очень странно, чтобы получить дату / время, используя Ruby evals.

D     # -> [2013 12 31]
T     # -> [23 59 59]
Говард
источник
Это дает дату / время в Лиме или Зулу?
Питер Тейлор
@PeterTaylor Не знаю - времена меняются ;-)
Говард
@howard Вы имели в виду, "времена, они меняются" ?
Джон Дворжак
Уже упоминается как тип времени в ОП.
Ручка двери
3

Встроенные модули |, & и ^ делают что-то полезное для блоков

Например, <array/string> <block> |можно использовать в качестве индексной функции

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

Есть идеи для <array/string> <block> &или <array/string> <block> ^?

Говард
источник
Что array block =теперь делать?
Джон Дворжак
@JanDvorak Сравнить. Полезно, если вы хотите сравнить строку с блоком, например "0<" {0<} =.
Говард
Как часто вам это нужно? Я бы предпочел опустить это и использовать array block =для «выбора по предикату»
Джон Дворжак
@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}сам).

Это позволило бы переопределять встроенные модули без потери доступа к их функциям (см. Мое предыдущее предложение ), поэтому, если бы я, скажем, по какой-то причине захотел поменять местами значения $и @, я мог бы просто сделать #$ #@ :$; :@;(или {$}_ {@}_ :$; :@;).

Илмари Каронен
источник
Одна деталь, в которой я не уверен, это то, что _должен делать оператор, если блок кода содержит назначения переменных. Очевидная вещь состоит в том, чтобы просто оставить любые :symbolтокены нетронутыми и расширить что-либо еще, но это приведет _к поломке любого кода с использованием локальных переменных. Однако сделать так, чтобы он не нарушал такой код, было бы непрактично сложно.
Ильмари Каронен
1
Ваша вторая версия будет соответствовать вместе с Свести оператор на массивах: [[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}.
Говард
1

Предустановка переменной с аргументами командной строки

К сожалению, ни один символ не остался неназначенным, но, может быть, мы можем использовать Aдля этого?

Говард
источник
_доступен. Возможно это? В любом случае, да, для golfscript нужен способ получения аргументов cmd line +1
дверная ручка
0

Собственные функции Ruby, которые я должен реализовать

Это вики сообщества; не стесняйтесь редактировать и добавлять функции, которые вы должны реализовать!

Формат: " nativeFunctionName( nameInMyLanguage)"

  • shuffle( sf)
  • tr( tr)
  • sample( sm)
Дверная ручка
источник
0

Используйте функции APL и HQ9 +!

  • Ярлыки, как в APL. РЕДАКТИРОВАТЬ: только что увидел ответ "псевдонимы Unicode". Это то, что я имел в виду :)
  • Другие ориентированные на гольф сочетания клавиш, такие как H9 +, HQ9 +, CHIQRSX9 +
XEM
источник
Хорошо, так как бы вы предложили это? Какие-то конкретные идеи?
Дверная ручка
символы Юникода, позволяющие делать сложные вещи в одном символе.
xem
@ Doorknob of Snow, я обновил свой ответ с помощью ярлыков, которые я хотел бы видеть: из APL и из CHIRQSX9 + :)
xem
Хм, вещь hq9 + кажется слишком обманчивой :-P
дверная ручка
Это ориентировано на гольф: P im, по-моему, ваш язык должен делать как минимум так же :)
xem
0

Четко разделяющие встроенные модули

например, столицы: встроенные модули; делая B для базы осуществимой

user11485
источник
1
Как уже упоминалось выше, нет необходимости расставаться. Если кому-то нравится перезаписывать встроенный файл, он должен это сделать. Я даже нашел полезные приложения переписывания операторов, как {-}:+.
Говард
Нет необходимости, также этот язык будет нечувствительным к регистру.
Ручка двери
2
Поскольку цель состоит в том, чтобы обеспечить меньшее количество ударов на отверстие, наличие чувствительности к регистру и большего количества встроенных элементов эффективно ведет к формулировке миссии.
0

Локальные переменные / замыкания

Одна вещь, которую мне действительно не хватает в GolfScript, - это возможность временно изменить значение символа .

В частности, в настоящее время нет способа временно переопределить значение встроенного «примитива»: как только вы, скажем, переопределите $, вы никогда больше не будете ничего сортировать в этой программе. (Ну, по крайней мере, не без написания вашей собственной реализации сортировки.) Было бы очень приятно, например, сказать, что в этом блоке кода $ есть что-то другое, но все же следует сохранить нормальное значение в другом месте.

В связи с вышеизложенным было бы неплохо связать символы в блоке кода с их текущим значением . Конечно, я могу писать, скажем, {$-1%}:rsortи иметь возможность использовать rsortдля сортировки и обращения массив, но это работает только до тех пор, пока определение $(или -1или %) не изменится, поскольку моя rsortфункция все еще вызывает глобальный символ $. Было бы неплохо иметь возможность сказать: «Давайте rsortделать то, что в $-1%данный момент делает, даже если эти символы будут позже переопределены».

В частности, стандартная библиотека может использовать этот тип привязки. Довольно удивительно осознавать, что, скажем, изменение nменяет поведение putsили что переопределение !полностью портит xor. (Опять же, здесь следует проявлять некоторую осторожность, поскольку, в частности, способность изменить поведение putsоберток оказывается единственным способом избежать печати окончательного перевода строки в текущей версии GS.)

Редактирование: возможность превращать символы обратно в блоки кода будет иметь большое значение для реализации этой функциональности. В частности, {foo}_синтаксис, предложенный в этом ответе, будет эффективно выполнять один уровень статической привязки путем расширения всех символов в блоке кода. Объедините это с комбинатором с фиксированной точкой для глубокого статического связывания, и Боб станет вашим дядей ...

Илмари Каронен
источник
Да ладно - все модные новые языки отмечают ленивую оценку ;-) Давайте сохраним эту функцию в GolfScript.
Говард
На второй мысли - вы правы, это скорее обязательный признак, чем оценка. Но тогда - статическое связывание является более сложным, чем кажется - например, обеспечить рекурсивные вызовы внутри определения.
Говард
"давайте rsortделать то, что в $-1%данный момент делает, даже если эти символы позже переопределены" Итак, Эмменталь?
CalculatorFeline
0

Больше встроенных функций

Сделайте так, чтобы все однобуквенные переменные az и AZ выполняли какую-то общую полезную функцию. Некоторые встроенные модули, которые отсутствуют:

  • min и max: все или некоторые из верхних 2 значений стека, верхние n значений стека по массиву
  • абсолютная величина
  • сумма и произведение массива. почему {+}*когда можно сделать S? У вас есть 52 функции для работы здесь!
  • Манхэттенское расстояние (т x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1). Е. Теперь это должно быть, @-A@@-A+если Aэто встроенная абсолютная величина. Конечно, это только из соображений моего последнего поста, но я всегда полагал, что это был бы хороший способ расширить сценарий гольфа: запишите, что Было бы удобно иметь функции, собирать их и добавлять их как встроенные.
  • Преобразуйте целое число в односимвольную строку (эквивалентную Python chr).
  • Пролить строку в стек (в настоящее время {}/)
  • Версия, :которая потребляет то, что хранится. Это должно было бы не застрять в идентификаторах, чтобы быть полезным.
  • Операторы для >=,<=
  • Как кто-то предложил, способ поместить переменную, содержащую блок, в стек без его выполнения. Таким образом, вы могли бы уменьшить ifs формы 1{\}{|}ifдо чего-то вроде1?\?|if
  • Встроенное преобразование base64 и поддержка zlib, чтобы встраивание данных занимало меньше символов
  • Помимо base64, создайте пользовательскую кодировку base93 (используя все печатные символы, которые не являются разделителями строк).
  • Ярлыки для 1$, 2$, 3$, 4$,5$
  • Оператор для копирования двух верхних элементов стека, как они есть, т.е. \.@.@\
клаву
источник
-3

Было бы хорошо, если бы значение, записанное или вычисленное в последней строке функции, было автоматически возвращено

XEM
источник
3
Это основано на стеке, так что ...
marinus
1
Там нет такого понятия, как функция.
Питер Тейлор
Функции ничего не возвращают ... и они называются блоками
Doorknob
Это может быть хорошо ... на другом языке. (Больше никаких надоедливых операторов возврата в конце функций! Ух! (Но мне никогда не требовались операторы возврата, так что ...))
CalculatorFeline