Первоначально однострочная программа представляла собой текстовый ввод в командную строку оболочки операционной системы, которая выполняет некоторые функции всего за одну строку ввода. Однострочник может быть
- выражение, написанное на языке оболочки;
- вызов интерпретатора вместе с исходным кодом программы для запуска интерпретатора;
- вызов компилятора вместе с исходным кодом для компиляции и инструкциями для выполнения скомпилированной программы.
Некоторые языки динамических сценариев, такие как AWK , sed и Perl , традиционно умело выражали однострочники. Специализированные интерпретаторы оболочки, такие как оболочки Unix или Windows PowerShell, позволяют создавать мощные однострочники.
Использование фразы «однострочный» было расширено, чтобы также включить исходный код программы для любого языка, который делает что-то полезное в одной строке.
История
Концепция однострочной программы известна с 1960-х годов [1], когда был выпущен язык программирования APL . Благодаря краткому синтаксису и мощным математическим операторам APL позволял представлять полезные программы несколькими символами.
В 1970-х однострочные стали ассоциироваться с расцветом домашних компьютеров и BASIC . Компьютерные журналы публиковали программы для набора текста на многих диалектах BASIC. Некоторые журналы посвящали регулярные колонки исключительно впечатляющим коротким и однострочным программам. [2]
Слово « однострочный» также имеет две ссылки в указателе книги «Язык программирования AWK» (книгу часто называют аббревиатурой TAPL ). В нем объясняется язык программирования AWK , который является частью операционной системы Unix . Авторы объясняют рождение однострочной парадигмы своей повседневной работой на ранних Unix- машинах:
Версия 1977 года имела только несколько встроенных переменных и предопределенных функций. Он был разработан для написания коротких программ […] Наша модель заключалась в том, что вызов должен состоять из одной или двух строк, вводиться и использоваться немедленно. Для соответствия этому стилю были выбраны значения по умолчанию […] Мы, как авторы, знали, как предполагается использовать язык, и поэтому мы писали только однострочники.
Обратите внимание, что это первоначальное определение однострочника подразумевает немедленное выполнение программы без какой-либо компиляции. Таким образом, строго говоря, только исходный код для интерпретируемых языков считается однострочным . Но это строгое понимание однострочного языка было расширено в 1985 году, когда IOCCC представил категорию Best One Liner for C , которая является компилируемым языком.
Примеры
Однострочники также используются, чтобы продемонстрировать дифференциальную выразительную силу языков программирования . Часто однострочники используются для демонстрации способностей к программированию. Часто проводятся конкурсы, чтобы увидеть, кто сможет создать самый выдающийся однострочный материал.
БАЗОВЫЙ
Одна строка BASIC обычно может содержать до 255 символов, а одна строка варьируется от простых игр [3] до графических демонстраций. Одна из наиболее известных демонстрационных однострочных строк , в просторечии известная как 10PRINT , написана для Commodore 64 :
10 РАСПЕЧАТАТЬ CHR $ ( 205,5 + RND ( 1 )); : GOTO 10
C
Следующий пример - это программа на языке C (победившая в категории «Лучшая однострочная» версия IOCCC ).
main ( int c , char ** v ) { return ! m ( v [ 1 ], v [ 2 ]);} m ( char * s , char * t ) { return * t -42 ? * s ? 63 == * t | * s == * t && m ( s + 1 , t + 1 ) :! * T : m ( s , t + 1 ) || * s && m ( s + 1 , t ); }
Эта однострочная программа представляет собой средство сопоставления с шаблоном глобуса. Он понимает глобальные символы `* ', означающие` ноль или более символов' и `? ' означает ровно один символ, как и в большинстве оболочек Unix .
Запустите его с двумя аргументами, строкой и шаблоном глобуса. Статус выхода равен 0 (оболочка true), если шаблон соответствует, в противном случае - 1. Шаблон glob должен соответствовать всей строке, поэтому вы можете использовать * в начале и в конце шаблона, если вы ищете что-то в середине. Примеры:
$ ./a.out foo 'f ??' ; эхо $? $ ./a.out 'лучшая короткая программа' '?? st * o ** p? *' ; эхо $?
AWK
Книга TAPL содержит 20 примеров однострочников в конце первой главы книги.
Вот самые первые из них:
- Выведите общее количество строк ввода:
END { print NR }
- Выведите десятую строку ввода:
NR == 10
- Распечатайте последнее поле каждой строки ввода:
{ print $ NF }
J
Вот примеры в J :
- Функция avg, возвращающая среднее значение списка чисел:
avg =: + / % #
- Быстрая сортировка :
quicksort =: (( $: @ ( <# [ ) , ( = # [ ) , $: @ ( > # [ )) ( {~ ? @ # )] ^: ( 1 <# )
Perl
Вот примеры на языке программирования Perl :
- Ищите повторяющиеся слова
perl -0777 -ne ' ' print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi
- Найдите палиндромы в / usr / dict / words
perl -lne ' ' / usr / dict / словаprint if $_ eq reverse
- редактирование на месте файлов * .c с заменой всего foo на bar
perl -p -i.bak -e ' s/\bfoo\b/bar/g
' * .c
Многие однострочники практичны. Например, следующий однострочник Perl перевернет все байты в файле:
perl -0777e 'напечатать скаляр в обратном порядке <>' имя файла
В то время как большинство однострочников Perl являются обязательными, поддержка Perl анонимных функций, замыканий, сопоставления, фильтра (grep) и сворачивания (List :: Util :: reduce) позволяет создавать «функциональные» однострочники.
Этот однострочный файл создает функцию, которую можно использовать для возврата списка простых чисел до значения первого параметра:
мой $ z = sub { grep { $ a = $ _ ; ! grep { ! ( $ a % $ _ ) } ( 2 .. $ _ - 1 )} ( 2 .. $ _ [ 0 ]) }
Его можно использовать в командной строке, например:
perl -e ' ' число$,=",";print sub { grep { $a=$_; !grep { !($a % $_) } (2..$_-1)} (2..$_[0]) }->(shift)
для вывода на печать списка простых чисел в диапазоне 2 - число, разделенных запятыми.
Haskell
Следующая программа на Haskell однострочная: она сортирует свои входные строки в ASCIIбетическом порядке .
main = ( mapM_ putStrLn . Data . List . sort . lines ) = << getContents - В ghci квалифицированное имя, такое как Data.List.sort, будет работать, хотя в качестве автономного исполняемого файла вам потребуется импортировать Data.List.
Еще более короткая версия:
main = interact ( unlines . Data . List . sort . lines ) - То же.
Можно использовать в командной строке, например:
кошка имя файла | ghc -e "взаимодействовать (unlines. Data.List.sort. lines)"
Ракетка
Следующая программа Racket эквивалентна приведенному выше примеру на Haskell:
#lang racket ( для-каждого displayln ( sort ( port-> lines ) string ))
и это можно использовать в командной строке следующим образом:
ракетка -е ' '(for-each displayln (sort (port->lines) string))
Python
Выполнение однострочных команд непосредственно в командной строке Unix может быть выполнено с помощью флага Python -cmd (для краткости -c) и обычно требует импорта одного или нескольких модулей. Заявления разделяются знаком ";" вместо новой строки. Например, чтобы напечатать последнее поле длинного списка unix:
ls -l | python -c " "import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]
Обертки Python
Было разработано несколько сценариев с открытым исходным кодом для облегчения создания однострочных Python. Сценарии, такие как pyp или Pyline, импортируют часто используемые модули и предоставляют более удобочитаемые переменные, пытаясь сделать функциональность Python более доступной в командной строке. Вот повтор вышеупомянутого примера (печать последнего поля длинного списка unix):
ls -l | pyp " whitespace [-1]" # "whitespace" представляет каждую строку, разделенную на пробел в pyp
ls -l | pyline "words [-1]" # "words" представляет каждую строку, разделенную на пробел в pyline
Исполняемые библиотеки
Модуль Python CGIHTTPServer, например, также является исполняемой библиотекой, которая работает как веб-сервер с CGI. Чтобы запустить веб-сервер, введите:
$ python -m CGIHTTPServer Обслуживает HTTP через 0.0.0.0 порт 8000…
Язык управления инструментами TCL
Tcl (Tool Command Language) - это динамический язык программирования / сценариев, основанный на концепциях оболочек Lisp, C и Unix. Его можно использовать в интерактивном режиме или путем запуска сценариев (программ), которые могут использовать систему пакетов для структурирования. Ниже приведены прямые цитаты из Wiki Books Tcl Programming. Текст в Wiki Books Tcl Programming доступен по лицензии Creative Commons Attribution-ShareAlike.
Многие строки также являются хорошо сформированными списками. Каждое простое слово представляет собой список длиной один, а элементы более длинных списков разделяются пробелами. Например, строка, соответствующая списку из трех элементов:
установить пример { foo bar grill }
Строки с несбалансированными кавычками или фигурными скобками или непробельные символы, следующие непосредственно за закрывающими фигурными скобками, не могут быть проанализированы как списки напрямую. Вы можете явно разделить их, чтобы составить список.
«Конструктор» для списков, конечно, называется списком. Рекомендуется использовать, когда элементы поступают из переменной или подстановки команд (фигурные скобки этого не делают). Поскольку команды Tcl в любом случае являются списками, следующая команда является полной заменой команды list:
# Программа one liners proc list args {set args }
Windows PowerShell
Поиск палиндромов в файле words.txt
Слова Get-Content . txt | Где { $ _ -eq -join $ _ [( $ _ . Length - 1 ) .. 0 ] }
Семантика конвейеров в PowerShell помогает реализовать сложные сценарии с однострочными программами. Этот однострочный сценарий в PowerShell берет список имен и счетчиков из файла значений, разделенных запятыми, и возвращает сумму счетчиков для каждого имени.
ipcsv . \ fruit . txt - H F , C | Группа F |% {@ { " $ ( $ _ . Имя ) " = ( $ _ . Группа | мера C -сумма ). Sum }} | значение сортировки
Смотрите также
Рекомендации
- ^ 10 ПЕЧАТЬ CHR $ (205,5 + RND (1)); : GOTO 10 (PDF) . Mit Press. 2014. с. 148. ISBN 9780262526746. Проверено 3 июля 2018 .
- ^ «Журнал БЕГ № 35» .
- ^ «Пользовательские однострочные игры Acorn (Побег из Вороса, Лексиаса, Гонка на Варпон, Грозовые облака над Заккитом, Зандер (также известный как Крен)» . bbcmicro.co.uk . Проверено 3 июля 2018 .
Внешние ссылки
- Ссылки на программирование на Perl
- Wikibooks Free Tcl Введение Программирование & Скачать PDF
- [1] sourceforge net, веб-сайт загрузки, а также несколько языков программирования
- Tcl Sources , основной сайт загрузки исходного кода Tcl и Tk
- Wiki Tcler , сценарии Tcl / Tk и справочная информационная служба
- TkDocs , Tcl / Tk Официальная документация и архивы