Первоначально однострочная программа была текстовым вводом в командную строку операционной системы оболочки, которая выполняет некоторую функцию всего за одну строку ввода. Однострочным может быть
Некоторые динамические языки сценариев, такие как AWK, sed, и Perl традиционно умело выражали однострочники. Специализированные интерпретаторы оболочки, такие как оболочки Unix или Windows PowerShell, позволяют создавать мощные однострочники.
Использование фразы «однострочный» было расширено, чтобы также включить исходный код программы для любого языка, который делает что-то полезное в одной строке.
Концепция однострочной программы известна с 1960-х годов, когда был выпущен язык программирования APL. Благодаря краткому синтаксису и мощным математическим операторам APL позволял представлять полезные программы несколькими символами.
В 1970-х однострочные стали ассоциироваться с появлением домашних компьютеров и BASIC. Компьютерные журналы публиковали программы набора на многих диалектах BASIC. Некоторые журналы посвящали регулярные колонки исключительно впечатляющим коротким и однострочным программам.
Слово «однострочный» также имеет две ссылки в указателе книги Язык программирования AWK (книга часто обозначается аббревиатурой TAPL). В нем объясняется язык программирования AWK, который является частью Unix операционной системы. Авторы объясняют рождение однострочной парадигмы своей повседневной работой на ранних Unix машинах:
В версии 1977 года было только несколько встроенных переменных и предопределенных функций. Он был разработан для написания коротких программ […] Наша модель заключалась в том, что вызов должен состоять из одной или двух строк, вводиться и использоваться немедленно. Для соответствия этому стилю были выбраны значения по умолчанию […] Мы, как авторы, знали, как предполагается использовать язык, и поэтому мы писали только однострочники.
Обратите внимание, что это первоначальное определение однострочника подразумевает немедленное выполнение программы без компиляции. Таким образом, в строгом смысле, только исходный код для интерпретируемых языков считается однострочным. Но это строгое понимание однострочного языка было расширено в 1985 г., когда IOCCC представил категорию Best One Liner для C, который является компилируемым языком.
Однострочники также используются, чтобы продемонстрировать дифференциальную выразительную силу языков программирования. Часто однострочники используются для демонстрации способностей к программированию. Часто проводятся конкурсы, чтобы увидеть, кто может создать самый выдающийся однострочный материал.
Одна строка BASIC обычно может содержать до 255 символов, а одна строка варьируется от простых игр до графических демонстраций. Один из наиболее известных демонстрационных однострочников в просторечии известен как 10PRINT и написан для Commodore 64 :
10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10
Следующий пример представляет собой программу 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? *'; эхо $?
Книга TAPL содержит 20 примеров однострочников в конце первой главы книги.
Вот самые первые из них:
END {print NR}
NR == 10
{print $ NF}
Вот примеры в J :
avg =: + /% #
quicksort =: (($: @ (<#[), (=#[), $:@(># [)) ({~? @ #)) ^: (1 <#)
Вот примеры на языке программирования Perl :
perl -0777 -ne 'print "$.: удвоил $ _ \ n ", а / \ b (\ w +) \ b \ s + \ b \ 1 \ b / gi
'
perl -lne 'напечатайте, если $ _ eq reverse
'/ usr / dict / words
perl -p -i.bak -e' s / \ bfoo \ b / bar / g
'*.c
Практично много однострочников. Например, следующий однострочник Perl перевернет все байты в файле :
perl -0777e 'печать скалярного обратного <>' имя_файла
Пока st Perl однострочники являются обязательными, поддержка Perl анонимных функций, замыканий, отображения, фильтра (grep) и сворачивания (List :: Util :: reduce) позволяет создавать «функциональные» однострочники.
Этот однострочный файл создает функцию, которую можно использовать для возврата списка простых чисел до значения первого параметра:
my $ 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 является однострочным: она сортирует свои входные строки ASCIIbetically.
main = (mapM_ putStrLn. Data.List.sort. lines) = << getContents -- In ghci a qualified name like Data.List.sort will work, although as a standalone executable you'd need to import Data.List.
Еще более короткая версия:
main = interact (unlines. Data.List.sort. lines) - Ditto.
Можно использовать в командной строке, например:
cat filename | ghc -e "interact (unlines. Data.List.sort. lines)"
Следующая программа Racket эквивалентна приведенному выше примеру Haskell:
#lang racket (для-каждой строки displayln (sort (port->lines) ))
), и это можно использовать в командной строке следующим образом:
racket -e '(for-each displayln (sort (port->lines) string ))
'
Выполнение однострочных строк непосредственно в командной строке Unix может быть выполнено с помощью флага -cmd Python (для краткости -c), и обычно требует импорта одного или нескольких модулей. Выражения разделяются знаком ";" вместо символов новой строки. Например, для вывода последнего поля длинного списка unix:
ls -l | python -c " import sys; [sys.stdout.write (''.join ([line.split ('') [- 1]])) для строки в sys.stdin]
"
Несколько сценариев с открытым исходным кодом были разработаны для облегчения создания однострочников 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 Serving HTTP on 0.0.0.0 port 8000…
Tcl (Tool Command Language) - динамический язык программирования / сценариев основан на концепциях оболочек Lisp, C и Unix. Его можно использовать в интерактивном режиме или путем запуска скриптов (программ), которые могут использовать систему пакетов для структурирования. Ниже приведены прямые цитаты из Wiki Books Tcl Programming. Текст в Wiki Books Tcl Programming доступен по лицензии Creative Commons Attribution-ShareAlike.
Многие строки также являются хорошо сформированными списками. Каждое простое слово представляет собой список длиной один, а элементы более длинных списков разделяются пробелами. Например, строка, которая соответствует списку из трех элементов:
set example {foo bar grill}
Строки с несбалансированными кавычками или фигурными скобками или непробельные символы, следующие непосредственно за закрывающими фигурными скобками, не могут быть проанализированы как списки напрямую. Вы можете явно разделить их, чтобы составить список.
«Конструктор» для списков, конечно, называется списком. Рекомендуется использовать, когда элементы поступают в результате подстановки переменных или команд (фигурные скобки этого не делают). Поскольку команды Tcl в любом случае являются списками, следующая команда полностью заменяет команду list:
# One liners program proc list args {set args}
Поиск палиндромов в файле words.txt
Get-Content words.txt | Где {$ _ -eq -join $ _ [($ _. Length-1).. 0]}
Семантика конвейера в PowerShell помогает реализовать сложные сценарии с однострочными программами. Этот однострочный сценарий в PowerShell берет список имен и счетчиков из файла значений, разделенных запятыми, и возвращает сумму счетчиков для каждого имени.
ipcsv. \ Fruit.txt –HF, C | Group F |% {@ {"$ ($ _. Name)" = ($ _. Group | measure C -sum).Sum}} | sort value