foo bar baz что это

Какова история использования «foo» и «bar» в примерах исходного кода?

Почему многие примеры кода, особенно учебные пособия, так часто используют имена «Foo» и «Bar»? Это почти стандарт.

Обновление: Википедия имеет список связанных сокращений, который включает некоторые оригинальные Второй мировой войны, перечисленные Аткинсоном.

Любой программист поймет мотивацию использования foo и bar для именования переменных. Они, безусловно, были частью культуры C / UNIX с самого начала, и, как указывает @Walter Mitty, предшествовали этому.

Обновление (05.10.2009): вот описание Аткинсона:

Обновление (23.11.2011): у @Hugo фантастический список невоенных предшественников.

Я думаю, что это фонетическое произношение фубара.

Имя, используемое в примерах и понимаемое для обозначения того, что обсуждается, или любого случайного члена класса обсуждаемых вещей. Слово foo является каноническим примером. Чтобы избежать путаницы, хакеры никогда (ну, почти никогда) не используют `foo ‘или другие подобные слова в качестве постоянных имен для чего-либо. В именах файлов распространенным соглашением является то, что любое имя файла, начинающееся с имени метасинтаксической переменной, является рабочим файлом, который может быть удален в любое время.

В некоторой степени список предпочтительных метасинтаксических переменных является культурной сигнатурой. Они встречаются как последовательно (используются для связанных групп переменных или объектов), так и в виде синглетонов. Вот несколько распространенных подписей:

Базола, ztesch:
Стэнфорд (с середины 70-х годов).

foo, bar, thud, grunt:
этот сериал был популярен в CMU. Другие переменные, связанные с CMU, включают gorp.

foo, bar, fum:
Сообщается, что эта серия распространена на XEROX PARC.

Фред, Барни:
см. запись для Фред. Это, как правило, британцы.

corge, grault, flarp:
популярный в университете Rutgers и среди хакеров GOSMACS.

zxc, spqr, wombat:
Кембриджский университет (Англия).

Шме
Беркли, GeoWorks, Ingres. Произносится / шме / с коротким / е /.

Университет
Брауна, начало 1970-х годов.

foo, bar, zot
Хельсинкский технологический университет, Финляндия.

blarg, качать
Новая Зеландия.

Тото, Тити, Тата, пачка
Франция.

aap, noot, mies
Нидерланды. Это первые слова, которые ребенок использовал, чтобы научиться писать по буквам на голландской орфографической доске.

Из всего этого, только ‘foo’ и ‘bar’ универсальны (а baz почти так). Составы foobar и `foobaz ‘также имеют очень широкую валюту.

Некоторые жаргонные термины также используются как метасинтаксические имена; например, бормочет и бормочет. См. Также Commonwealth Hackish для обсуждения многочисленных метасинтаксических переменных, найденных в Великобритании и Содружестве.

В статье также приведены общие примеры таких переменных на разных языках программирования:

C
В следующем примере языка программирования C имя функции foo и строка имени переменной являются метасинтаксическими переменными. Строки, начинающиеся с //, являются комментариями.

Спам, ветчина и яйца являются основными метасинтаксическими переменными, используемыми в языке программирования Python. [5] Это ссылка на знаменитый комедийный набросок «Спам» Монти Пайтона, одноименный язык. [6] В следующем примере спам, ветчина и яйца являются метасинтаксическими переменными, а строки, начинающиеся с #, являются комментариями.

В следующем примере baz, foo и bar являются метасинтаксическими переменными, а строки, начинающиеся с #, являются комментариями.

Вот ответ Википедии:

Термины foobar, foo, bar и baz являются общими именами-заполнителями (также называемыми метасинтаксическими переменными), используемыми в компьютерном программировании или документации, связанной с компьютером. Они обычно используются для представления неизвестных значений, как правило, при описании сценария, в котором цель неизвестных значений понятна, но их точные значения являются произвольными и неважными. Термины могут использоваться для обозначения любой части сложной системы или идеи, включая данные, переменные, функции и команды. Сами слова не имеют смысла в этом использовании и являются просто логическими представлениями, так же, как буквы x и y используются в алгебре. Foobar часто используется один; foo, bar и baz обычно используются в том порядке, когда требуется несколько сущностей.

Фу вошел в английский язык как неологизм и считается многими каноническим примером метасинтаксической переменной. [Цитата нужна] Он широко используется в примерах компьютерного программирования (иногда выражается как «только один раз») и псевдокоде. Эрик С. Рэймонд назвал это «важным хакерством» наряду с клуджем и храбростью. [1]

Источник

(Нe) всё в JavaScript — объект

foo bar baz что это

foo bar baz что это

Те, кто просто хочет получить ответы, не стесняйтесь сразу переходить к «Итого» в конце заметки

Существует много путаницы в том, является ли JavaScript объектно-ориентированным языком программирования (ООП) или функциональным языком. Действительно, JavaScript может работать и так, и так.

Но это заставило людей задуматься: « Все ли в JavaScript — объекты?», « А что насчет функций?».

Эта заметка расставит все на свои места.

Начнем с самого начала

В JavaScript существует шесть примитивных типов данных:

В дополнение к этим шести примитивным типам, стандарт ECMAScript также определяет тип объекта, представляющий собой хранилище ключей.

Итак, короче говоря, все, что не является примитивным типом, является объектом, включая функции и массивы.

Примитивные типы

Вы можете переназначить примитивный тип переменной, но это будет новое значение, старое не будет и не может быть изменено.

Кроме того, примитивные типы сохраняются как значения, в отличие от объектов, хранящихся в качестве ссылки. Это важно иметь ввиду при выполнении проверок равенства.

Примитивные типы хранятся по значению, объекты хранятся по ссылке

Функции

И как к обычным объектам, вы можете добавлять новые свойства:

Это делает функции объектами первого класса, так как их можно передать в качестве аргумента в другие функции, как и любой другой объект.

Метод — это свойство объекта, являющееся функцией.

Функции-конструкторы

Если у вас есть несколько объектов, использующих одну и ту же реализацию, вы можете поместить эту логику внутри функции-конструктора, а затем вызвать конструктор для создания этих объектов.

Любая функция может быть функцией-конструктором

Вы можете использовать функцию-конструктор для создания нового объекта

И наоборот, запуск обычной функции в качестве функции-конструктора обычно возвращает новый пустой объект, как вы уже видели.

Объекты-оболочки

Но вы также можете использовать функцию String в качестве функции-конструктора.

Будет создан новый объект (часто называемый объектом-оболочкой), представляющий строку dog со следующими свойствами:

Автоупаковка (autoboxing)

Этот процесс называется автоупаковкой ( autoboxing). Когда вы пытаетесь вызвать свойство или метод для определенных примитивных типов, JavaScript преобразует его во временный объект-оболочку и получает доступ к его свойству или методу, не затрагивая сам оригинал.

Это также объясняет, почему JavaScript не возмущается, когда вы пытаетесь присвоить свойство примитивному типу, потому что присвоение выполняется на временном объекте-оболочке, а не на самом примитивном типе.

Источник

Глючный код на Python: 10 самых распространенных ошибок, которые допускают разработчики

О Python

Python — это интерпретируемый, объектно-ориентированный язык программирования высокого уровня с динамической семантикой. Встроенные структуры данных высокого уровня в сочетании с динамической типизацией и динамическим связыванием делают его очень привлекательным для БРПС (быстрой разработки прикладных средств), а также для использования в качестве скриптового и связующего языка для подключения существующих компонентов или сервисов. Python поддерживает модули и пакеты, тем самым поощряя модульность программы и повторное использование кода.

О данной статье

Простота и легкость в освоении данного языка может ввести разработчиков в заблуждение (особенно тех, кто еще только начинает изучать Python), так что можно упустить из виду некоторые важные тонкости и недооценить силу разнообразия возможных решений с помощью Python.

Имея это в виду, в этой статье представлен «топ-10» тонких, трудных для обнаружения ошибок, которые могут допустить даже продвинутые разработчики Python.

Ошибка № 1: неправильное использование выражений в качестве значений по умолчанию для аргументов функций

Python позволяет указывать, что у функции могут быть необязательные аргументы, путем задания для них значения по умолчанию. Это, конечно, очень удобная особенность языка, но может привести к неприятным последствиям, если тип такого значения будет изменяемым. Например, рассмотрим следующее определение функции:

Распространенная ошибка в данном случае — это думать, что значение необязательного аргумента будет устанавливаться в значение по умолчанию каждый раз, как функция будет вызываться без значения для этого аргумента. В приведенном выше коде, например, можно предположить, что повторно вызывая функцию foo() (то есть без указания значения для агрумента bar), она всегда будет возвращать «baz», поскольку предполагается, что каждый раз, когда вызывается foo () (без указания аргумента bar), bar устанавливается в [ ] (т. е. новый пустой список).

Но давайте посмотрим что же будет происходить на самом деле:

А? Почему функция продолжает добавлять значение по умолчанию «baz» к существующему списку каждый раз, когда вызывается foo(), вместо того, чтобы каждый раз создавать новый список?

Ответом на данный вопрос будет более глубокое понимание того, что творится у Python «под капотом». А именно: значение по умолчанию для функции инициализируется только один раз, во время определения функции. Таким образом, аргумент bar инициализируется по умолчанию (т. е. пустым списком) только тогда, когда foo() определен впервые, но последующие вызовы foo() (т. е. без указания аргумента bar) продолжат использовать тот же список, который был создан для аргумента bar в момент первого определения функции.

Для справки, распространенным «обходным путем» для этой ошибки является следующее определение:

Ошибка № 2: неправильное использование переменных класса

Рассмотрим следующий пример:

Вроде все в порядке.

Ага, все как и ожидалось.

Что за черт?! Мы же только изменили A.x. Почему же C.x тоже изменилось?

В Python переменные класса обрабатываются как словари и следуют тому, что часто называют Порядком разрешения методов (MRO). Таким образом, в приведенном выше коде, поскольку атрибут x не найден в классе C, он будет найден в его базовых классах (только A в приведенном выше примере, хотя Python поддерживает множественное наследование). Другими словами, C не имеет своего собственного свойства x, независимого от A. Таким образом, ссылки на C.x фактически являются ссылками на A.x. Это будет вызывать проблемы, если не обрабатывать такие случаи должным образом. Так что при изучении Python обратите особое внимание на аттрибуты класса и работу с ними.

Ошибка № 3: неправильное указание параметров для блока исключения

Предположим, что у вас есть следующий кусок кода:

Проблема здесь заключается в том, что выражение except не принимает список исключений, указанных таким образом. Скорее, в Python 2.x выражение «except Exception, e» используется для привязки исключения к необязательному второму заданному второму параметру (в данном случае e), чтобы сделать его доступным для дальнейшей проверки. В результате в приведенном выше коде исключение IndexError не перехватывается выражением except; скорее, вместо этого исключение заканчивается привязкой к параметру с именем IndexError.

Правильный способ перехвата нескольких исключений с помощью выражения except — указать первый параметр в виде кортежа, содержащего все исключения, которые нужно перехватить. Кроме того, для максимальной совместимости используйте ключевое слово as, так как этот синтаксис поддерживается как в Python 2, так и в Python 3:

Ошибка № 4: непонимание правил области видимости Python

Вышеуказанная ошибка возникает потому, что, когда вы присваиваете переменную в области видимости, Python автоматически считает ее локальной для этой области и скрывает любую переменную с аналогичным именем в любой вышестоящей области.

Таким образом, многие удивляются, когда получают UnboundLocalError в ранее работающем коде, когда он модифицируется путем добавления оператора присваивания где-нибудь в теле функции.

Эта особенность особенно сбивает разработчиков с толку при использовании списков. Рассмотрим следующий пример:

А? Почему foo2 падает, в то время как foo1 работает нормально?

Ответ такой же, как в предыдущем примере, но, по распространенному мнению, здесь ситуация более тонкая. foo1 не применяет оператор присваивания к lst, тогда как foo2 — да. Помня, что lst + = [5] на самом деле является просто сокращением для lst = lst + [5], мы видим, что мы пытаемся присвоить значение lst (поэтому Python предполагает, что он находится в локальной области видимости). Однако значение, которое мы хотим присвоить lst, основано на самом lst (опять же, теперь предполагается, что он находится в локальной области видимости), который еще не был определен. И мы получаем ошибку.

Ошибка № 5: изменение списка во время итерации по нему

Проблема в следующем куске кода должна быть достаточно очевидной:

Удаление элемента из списка или массива во время итерации по нему — это проблема Python, которая хорошо известна любому опытному разработчику программного обеспечения. Но, хотя приведенный выше пример может быть достаточно очевидным, даже опытные разработчики могут встать на эти грабли в гораздо более сложном коде.

К счастью, Python включает в себя ряд элегантных парадигм программирования, которые при правильном использовании могут привести к значительному упрощению и оптимизации кода. Дополнительным приятным следствием этого является то, что в более простом коде вероятность попасться на ошибку случайного удаления элемента списка во время итерации по нему значительно меньше. Одна из таких парадигм — генераторы списков. Кроме того, понимание работы генераторов списков особенно полезны для избежания этой конкретной проблемы, как показано в этой альтернативной реализацией приведенного выше кода, которая прекрасно работает:

Ошибка № 6: непонимание того, как Python связывает переменные в замыканиях

Рассмотрим следующий пример:

Вы можете ожидать следующий вывод:

Но на самом деле вы получите вот что:

Это происходит из-за поздней привязки в Python, которое заключается в том, что значения переменных, используемых в замыканиях, ищутся во время вызова внутренней функции. Таким образом, в приведенном выше коде всякий раз, когда вызывается какая-либо из возвращаемых функций, значение i ищется в окружающей области видимости во время ее вызова (а к тому времени цикл уже завершился, поэтому i уже был присвоен конечный результат — значение 4).

Решение этой распространенной проблемы с Python будет таким:

Вуаля! Мы используем здесь аргументы по умолчанию для генерации анонимных функций для достижения желаемого поведения. Некоторые назвали бы это решение элегантным. Некоторые —
тонким. Некоторые ненавидят подобные штуки. Но если вы разработчик Python, в любом случае, это важно понимать.

Ошибка № 7: создание циклических зависимостей модуля

Допустим, у вас есть два файла, a.py и b.py, каждый из которых импортирует другой, следующим образом:

Сначала попробуем импортировать a.py:

Сработало просто отлично. Возможно, это вас удивляет. В конце концов, модули циклически импортируют друг друга и это, вероятно, должено быть проблемой, не так ли?

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

Итак, возвращаясь к нашему примеру, когда мы импортировали a.py, у него не было проблем с импортом b.py, поскольку b.py не требует, чтобы что-либо из a.py было определено во время его импорта. Единственная ссылка в b.py на a — это вызов a.f(). Но этот вызов в g() и ничего в a.py или b.py не вызывает g(). Так что все работает прекрасно.

Но что произойдет, если мы попытаемся импортировать b.py (без предварительного импорта a.py, то есть):

Ой-ой. Это не хорошо! Проблема здесь в том, что в процессе импорта b.py он пытается импортировать a.py, который, в свою очередь, вызывает f(), который пытается получить доступ к b.x. Но b.x еще не было определено. Отсюда исключение AttributeError.

По крайней мере, одно из решений этой проблемы довольно тривиально. Просто измените b.py, чтобы импортировать a.py в g():

Теперь, когда мы его импортируем, все нормально:

Ошибка № 8: пересечение имен с именами модулями стандартной библиотеки Python

Одна из прелестей Python — это множество модулей, которые поставляются «из коробки». Но в результате, если вы сознательно не будете за этим следить, можно столкнуться с тем, что имя вашего модуля может быть с тем же именем, что и модуль в стандартной библиотеке, поставляемой с Python (например, в вашем коде может быть модуль с именем email.py, который будет конфликтовать со модулем стандартной библиотеки с таким же именем).

Это может привести к серьезным проблемам. Например, если какой-нибудь из модулей будет пытаться импортировать версию модуля из стандартной библиотеки Python, а у вас в проекте будет модуль с таким же именем, который и будет по ошибке импортирован вместо модуля из стандартной библиотеки.

Поэтому следует проявлять осторожность, чтобы не использовать те же имена, что и в модулях стандартной библиотеки Python. Гораздо проще изменить название модуля в своем проекте, нежели подать запрос на изменение имени модуля в стандартной библиотеке и получить на него одобрение.

Ошибка № 9: неспособность учесть различия Python 2 и Python 3

Рассмотрим следующий файл foo.py:

На Python 2 он отработает нормально:

Но теперь давайте посмотрим как он будет работать в Python 3:

Что здесь только что произошло? «Проблема» в том, что в Python 3 объект в блоке исключения недоступен за его пределами. (Причина этого заключается в том, что в противном случае объекты в этом блоке будут сохраняться в памяти до тех пор, пока сборщик мусора не запустится и не удалит ссылки на них оттуда).

Один из способов избежать этой проблемы — сохранить ссылку на объект блока исключения за пределами этого блока, чтобы он оставался доступным. Вот версия предыдущего примера, которая использует эту технику, тем самым получая код, который подходит как для Python 2, так и для Python 3:

Запустим его в Python 3:

Ошибка № 10: неправильное использование метода __del__

Допустим, у вас есть вот такой файл mod.py:

И вы пытаетесь сделать вот такое из другого another_mod.py:

И получите ужасный AttributeError.

Почему? Потому что, как сообщается здесь, когда интерпретатор отключается, глобальные переменные модуля все имеют значение None. В результате в приведенном выше примере, в момент вызова __del__, имя foo уже было установлено в None.

Решением этой «задачи со звездочкой» будет использование atexit.register(). Таким образом, когда ваша программа завершает выполнение (то есть при нормальном выходе из нее), ваши handle’ы удаляются до того, как интерпретатор звершает работу.

С учетом этого, исправление для приведенного выше кода mod.py может выглядеть примерно так:

Подобная реализация обеспечивает простой и надежный способ вызова любой необходимой очистки после обычного завершения программы. Очевидно, что решение о том, как поступить с объектом, который связан с имненем self.myhandle, остается за foo.cleanup, но, думаю, идею вы поняли.

Заключение

Python — это мощный и гибкий язык со множеством механизмов и парадигм, которые могут значительно повысить производительность. Однако, как и в случае с любым программным инструментом или языком, при ограниченном понимании или оценке его возможностей, при разработке могут возникать непредвиденные проблемы.

Ознакомление с нюансами Python, затронутыми в этой статье, поможет оптимизировать использование языка, избегая при этом некоторых распространенных ошибок.

Источник

Какова история использования «foo» и «bar» в примерах исходного кода?

Почему многие примеры кода, особенно учебники, часто используют имена «Foo» и «Bar»? Это почти стандарт.

14 ответов

Обновление: в Википедии есть список соответствующих аббревиатур, который включает в себя некоторые оригинальные WWII, перечисленные Аткинсоном.

Любой программист поймет мотивацию использования foo и bar для обозначения переменных. Они, конечно, были частью культуры C /UNIX с самого начала, и, как указывает @Walter Mitty, она предшествовала.

Обновление (10/5/2009): Вот описание Аткинсона:

Я думаю, что это фонетическое произнесение фубара.

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

В какой-то мере список предпочтительных метасинтетических переменных является культурной подписью. Они встречаются как в серии (используются для связанных групп переменных или объектов), так и в виде одиночек. Вот несколько общих подписей:

bazola, ztesch:
Стэнфорд (с середины 70-х годов).

foo, bar, thud, grunt:
Эта серия была популярна в КМУ. Другие связанные с CMU переменные включают gorp.

foo, bar, fum:
Эта серия, как сообщается, распространена в XEROX PARC.

fred, barney:
См. Запись для fred. Это, как правило, британцы.

corge, grault, flarp:
Популярный в Rutgers University и среди хакеров GOSMACS.

zxc, spqr, wombat:
Кембриджский университет (Англия).

shme
Berkeley, GeoWorks, Ingres. Произнесено /shme /с коротким /e /.

Snork
Университет Брауна, начало 1970-х годов.

foo, bar, zot
Хельсинкский технологический университет, Финляндия.

blarg, wibble
Новая Зеландия.

toto, titi, tata, tutu
Франция.

пиппо, плуто, бумажно-белое

Италия. Pippo /pee’po /и Paperino /pa-per-ee’-no /являются итальянскими именами для Гуфи и Дональда Дака.

aap, noot, mies
Нидерланды. Это первые слова, которые ребенок учил писать на голландской орфографической доске.

Из всего этого только «foo» и «bar» универсальны (и почти так). Соединения foobar и `foobaz ‘также пользуются очень широкой валютой.

Некоторые термины жаргона также используются как метасинтетические имена; barf и mumble, например. См. Также Commonwealth Hackish для обсуждения многочисленных метасинтатических переменных, найденных в Великобритании и Содружестве.

В статье также приводятся общие примеры таких переменных в разных языках программирования:

Python

рубин

В следующем примере baz, foo и bar являются метасинтактическими переменные и строки, начинающиеся с #, являются комментариями.

Вот ответ Википедии:

Foo вошел в английский язык как неологизм и рассматривается многие из них являются каноническим примером метасинтатическая переменная. [цитата] необходимо] Он широко используется в примеры компьютерного программирования (иногда выражается как «на один раз только «) и псевдокодом. Эрик С. Раймонд назвал его «важным хакеризмом», наряду с kludge и cruft. [1]

«Foo» и «bar», поскольку метасинтатические переменные были популяризированы MIT и DEC, первые ссылки находятся в работе над LISP и PDP-1 и Project MAC с 1964 года.

Многие из этих людей были в MIT’s Tech Model Railroad Club, где мы нашли первое документированное использование «foo» в технических кругах в 1959 году (и вариант в 1958 году).

Оба «foo» и «bar» (и даже «baz») были хорошо известны в популярной культуре, особенно из комиксов Smokey Stover и Pogo, которые будут прочитаны многими членами TMRC.

Кроме того, похоже, что военный FUBAR способствовал их популярности.

Использование одинокого «foo» как бессмысленного слова довольно хорошо документировано в популярной культуре в начале 20-го века, равно как и военный FUBAR. (Некоторое фоновое чтение: FOLDOC FOLDOC файл жаргонов Файл жаргонов Википедия RFC3092 )

ОК, поэтому давайте найдем некоторые ссылки.

STOP PRESS! После публикации этого ответа я обнаружил эту прекрасную статью о «foo» в выпуске 1938 в пятницу 14 января = «http: //tech.mit.edu/V57/PDF/N57.pdf» rel =» nofollow noreferrer «> Технология (« Самый старый и самый большой газета и amp; первая газета, опубликованная в Интернете »), том LVII. № 57, Price Three Cents:

Как ругательство, конечно, «foo!» имеет определенную и, возможно, незаменимую позицию на нашем языке, хотя мы опасаемся, что чрезмерное использование, которому оно подвергается в настоящее время, вполне может привести к его раннему (и, увы, темному) забвению. Мы говорим, увы, потому что правильное использование слова может привести к таким счастливым инцидентам, как следующее.

Это была лекция профессора Слейтера профессора Слейтера в 8.50 Thermodynamics в комнате 6-120. Профессор, прикрыв переднюю сторону доски, установил ручку, которая управляет лифтовым механизмом, показывая тем временем класс, чтобы продолжить обсуждение. Передняя доска медленно, величественно поднялась, показав доску за ней, и на этой доске, написав большие, символы, которые пишут «FOO»!

К тому времени, когда поезд достиг станции, неофиты настолько наполнены рассказами о славе Phi Omicron Omicron, которые обычно называют Foo, что они легкие жертвы.

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

Возмущенная мать пяти.

И Технология в декабре 1938

Общая тенденция мысли лучше всего интерпретировать из замечаний сделанные в конце избирательных бюллетеней. Один голос сказал: «Яне думайте, что я делаю, это любой бизнес Пулвера », а другой просто добавил короткое« Foo ».

Первый документированный «foo» в технических кругах, вероятно, 1959 Словарь языка TMRC :

FOO: священный слог (FOO MANI PADME HUM); чтобы говорить только, когда под вдохновением, чтобы общаться с Божеством. Наша первая обязанность заключается в том, чтобы заставить Foo Counters поворачиваться.

Использование этого слова в TMRC предшествует моему приходу. Счетчик foo может просто случайно мигать огнями или может быть реальным счетчиком с неясным входом.

Более ранние версии этого лексикона вывели «baz» как стенографическое повреждение бара. Тем не менее, Пит Самсон (компилятор лексики TMRC) сообщает, что он был уже текущим, когда он присоединился к TMRC в 1958 году. Он говорит: «Это произошло от« Пого ». Альберт Аллигатор, когда он был досаден или возмущен, кричал« Bazz Fazz! ». или «Rowrbazzle!» Считалось, что макет клуба моделирует (мифические) графства Новой Англии Роверфолк и Бассекс (Rowrbazzle смешивается с (Норфолк /Саффолк /Миддлсекс /Эссекс) ».

За год до словаря TMRC, 1958 ‘MIT Voo Doo Gazette («Юморное дополнение к офису MIT Deans») %20(PDF)%20%20%D1%83%D0%BF%D0%BE%D0%BC%D0%B8%D0%BD%D0%B0%D0%B5%D1%82%20Foocom%20%D0%B2%C2%AB%20%D0%97%D0%B0%D0%BA%D0%BE%D0%BD%D0%B0%D1%85%20%D0%9C%D0%B5%D1%80%D1%84%D0%B8%20%D0%B8%20%D0%A4%D0%B8%D0%BD%D0%B0%D0%B3%D0%BB%D0%B5%20%C2%BB%D0%94%D0%B6%D0%BE%D0%BD%D0%B0%20%D0%91%D0%B0%D0%BD%D0%B6%D0%B0%D1%84%D0%B0%20(%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%BA%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B8)%20

%20%D0%A2%D0%B0%D0%BA%D0%B6%D0%B5%20%201964%20%20MIT%20Voo%20Doo%20 (PDF) ссылается на использование TMRC:

Но давайте вспомним, что этот вопрос касается примеров кода, поэтому давайте найдем «foo», «bar» и «foobar», опубликованные в коде.

Итак, Jargon File 4.4.7 говорит о «foobar «:

Вероятно, изначально распространялся через руководства DECsystem от Digital Equipment Corporation (DEC) в 1960-х и начале 1970-х годов; подтвержденные наблюдения там возвращаются к 1972 году.

Таким образом, поскольку «FOO» является именем для себя, «COMITRIN» будет обрабатывать как «FOO», так и «(FOO)» точно так же.

Также включает другие метасинтатические переменные, такие как: FOO CROCK GLITCH /POOT TOOR /ON YOU /SNAP CRACKLE POP /X Y Z

Я ожидаю, что это почти то же самое, что и следующая ссылка «foo» из Project MAC в MIT в январе 1964 AIM-064, или Упражнения LISP Тимоти П. Харт и Майкл Левин:

автомобиль [((FOO. CROCK). GLITCH)]

Он делитсямногие другие метасинтетические переменные, такие как: CHI /BOSTON NEW YORK /SPINACH BUTTER STEAK /FOO CROCK GLITCH /POOT TOOP /TOOT TOOT /ISTHISATRIVIALEXCERCISE /PLOOP FLOT TOP /SNAP CRACKLE POP /ONE TWO THREE /PLANE SUB THRESHER

EXPLODE, как и PRIN1, вставляет слэши, поэтому (EXPLODE (QUOTE FOO /BAR)) PRIN1 как (F O O ///B A R) или PRINC как (F O O /B A R).

Еще несколько напоминаний.

Во второй файл жаргона, касающийся Foo Bar. Я могу проследить его, по крайней мере, до 1963 года, и номер PDP-1 серийный номер 2, который находился на втором этаже здания 26 в Массачусетском технологическом институте. Foo и Foo Bar, а после 1964 года в PDP-6 в проекте MAC.

Джон В. Эверетт напоминает в 1996 году:

Когда я присоединился к DEC в 1966 году, foobar уже обычно использовался как имя файла выброса. Я считаю, что fubar стал foobar, потому что PDP-6 поддерживал шесть имен символов, хотя я всегда предполагал, что этот термин перенесен в DEC из MIT. В те времена в DEC было много типов MIT, некоторые из которых работали с CTSS 7090/7094. Поскольку 709x также был 36-битной машиной, foobar, возможно, использовался в качестве общего имени файла.

У Дика Груена было устройство в его комнате в общежитии, обычная сборка B-аккумулятора, резисторов, конденсаторов и неоновых ламп NE-2, которые он назвал «счетчиком foo». Это было бы около 1964 года или около того.

Использование имен переменных FOO и BAR в качестве примеров происходит по меньшей мере до 1964 года и IBM 7070. Это тоже может быть старше, но именно там я впервые увидел его. Это было в Ассемблере. Каким будет эквивалент FORTRAN? IFOO и IBAR?

Самый ранний ассемблер PDP-1 использовал два символа для символов (18-битная машина), программисты всегда оставляли несколько слов в качестве места исправления для исправления проблем. (Перейти к месту патча, сделать новый код, вернуться назад) Это пространство условно было названо FU: это означало Fxxx Up, место, где вы исправили Fxxx Ups. Когда говорят, это было известно как пространство FU. Позже Ассемблеры (например, MIDAS разрешили три символа тэгов, так что FU стал FOO, и поскольку ВСЕ программисты PDP-1 скажут вам, что это пространство FOO.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *