— Поддержка языковых литералов
Ioke позволяет переопределять литералы, но не определять новые. Как это работает, так это то, что литералы просто преобразуются в отправку сообщений, а затем вы можете переопределить соответствующие методы, как и любые другие.
Например, это «литеральный синтаксис» для Dict
с двумя записями, одна из которых отображает Symbol
в Text
, а другая — Symbol
в Number
:
{ :name => "Йорг", :age => 31 }
Это на самом деле преобразуется в отправку сообщения для сообщения с именем {}
(кстати: списки работают одинаково, их соответствующее сообщение []
). Это точно эквивалентно (и может быть записано так, если хотите):
{}(:name => "Jörg", :age => 31)
Итак, =>
на самом деле просто оператор, который определен почти для всех объектов и который просто возвращает Пара
, где ключ (первый элемент) является получателем, а значение — аргументом.
{}(:name =>("Jörg"), :age =>(31))
Символ :
, обозначающий буквенный символ, также переводится в сообщение для отправки:
{}(:("name") =>("Jörg"), :("age") =>(31 ))
Текстовый литерал преобразуется в отправку internal:createText 9Сообщение 0006:
{}(:("name") =>(internal:createText("Jörg")), :("age") =>(31))
[Примечание: очевидно, что то, как это здесь написано, приведет к бесконечной рекурсии. Правда в том, что аргументом internal:createText
, очевидно, является не Ioke Text
, а строка платформы. т.е. для ikj
, реализации JVM для Ioke, это на самом деле java.lang.String
и для ikc
, реализация CIL, это Системная строка
. Я выразил это здесь, используя тройные кавычки.]
{}(:("name") =>(internal:createText("""Jörg""")), :("age") =>(31) )
Это просто оставляет нас с номером, который, как вы уже догадались, также является отправкой сообщения:
{}(:("name") =>(internal:createText("""Jörg""")), :("возраст") =>(внутренний:createNumber("""31""")))
Поскольку все является отправкой сообщения, это позволяет вам настраивать поведение литералов по желанию, просто реализуя соответствующие методы. Вот короткая стенограмма с
iik
, интерактивный Ioke REPL:
iik> "Привет" +> "Привет" iik> внутренний: createText = метод (необработанный, супер (необработанный) верхний) iik> "Привет" +> "ЗДРАВСТВУЙТЕ"
Converge позволяет использовать мощное метапрограммирование во время компиляции, включая функцию под названием DSL Blocks . Блок DSL — это блок кода, который не использует синтаксис Converge. Блок DSL выглядит так:
$<>: здесь
Это работает следующим образом: строка между $<<
и >>
является именем функции, которая вызывается во время компиляции и получает весь блок DSL в виде строки (а также как некоторые метаданные исходного кода, такие как номер строки, имя файла и т. д.) и возвращает фрагмент абстрактного синтаксического дерева сходимости. Таким образом, в этом конкретном случае будет такая функция:
func xml(dsl_block, src_infos): // реализуем XML-анализатор здесь ... вернуться на восток
Фактор позволяет определить слов разбора , которые являются словами, которые влияют на то, как анализируются другие слова в той же области. На самом деле Factor имеет реализацию библиотеки XML, которая использует синтаксические слова для получения синтаксиса, очень похожего на XML-литералы Scala, но являющегося обычным кодом Factor:
: feed>xml ( feed -- xml ) [название>>] [ URL>> присутствует ] [ записи>> [ запись> xml ] карта ] три<название><->название> <ссылка href=<-> /> <-> канал> XML> ;
[Краткое введение в Factor: :
определяет новое слово, то есть первая строка определяет слово с именем feed>xml
, которое принимает один аргумент и дает один результат. Первые три строки слова извлекают заголовок, URI и записи из объекта фида и помещают их в стек.
XML>
снова выключает его. Внутри кода XML
<->
берет значение из стека и вставляет его в XML.]
Common Lisp
Макросы Common Lisp Reader позволяют вам подключиться к этапу чтения, то есть к этапу, который берет строку и создает вложенные списки, а затем передает их компилятору/оценщику. Они требуют, чтобы вы выбрали уникальный префикс из одного или двух символов, и они являются глобальными. С первым не так много проблем, так как мы можем просто выбрать символ <
в качестве нашего префикса, чтобы он выглядел естественно.
Perl 6 должен позволять вам изменять синтаксис во время работы программы. Perl 6 имеет динамическую изменяемую грамматику, что означает, что код анализируется во время его выполнения и может изменить грамматику, чтобы другой код, находящийся дальше в файле, анализировался с использованием новой грамматики.
OMeta/COLA
Язык OMeta Алессандро Варта, работающий поверх системы COLA Яна Пиумарты, позволяет использовать то, что они называют «языками, зависящими от настроения». т.е. языки, спецификация и реализация которых настолько легки, что вы можете использовать их только для одной строки в середине вашей программы, а затем снова переключаться на другой синтаксис.
Используется в программе «Изобретение фундаментальных новых вычислительных технологий» в Исследовательском институте точки зрения Алана Кея. Одним из примеров использования является реализация всего сетевого стека TCP/IP всего в 200 строках кода путем разработки языка, синтаксис которого идентичен художественным диаграммам ASCII, используемым в IETF RfC, и другому языку для написания конечных автоматов сетевого протокола. Затем реализация сетевого стека просто состоит из копирования и вставки диаграмм ASCII из RFC и передачи описаний конечного автомата на английском языке из RFC в язык конечного автомата.
(О, если вам интересно: 200 строк предназначены не только для диаграмм ASCII и конечных автоматов. Они также включают синтаксические анализаторы и компиляторы для двух языков. )
Язык программирования π, вероятно, тоже интересен .
2016 Декабрь « Буквальное мышление
Одна из вещей, которые я не упомянул в своем обзоре Words on the Move Джона МакУортера, заключалась в том, что он использовал минимальные пары для изучения гласных английского языка. Минимальная пара — это пара слов или фраз, идентичных во всех аспектах, кроме одного, выбранных таким образом, чтобы проиллюстрировать, как этот аспект приводит к различию в значении или грамматике. Например, большинство носителей английского языка находят предложение Что и где я буду спать? неграмотно, но если мы изменим всего одно слово, заменив глагол спать глаголом учить , предложение улучшится для многих говорящих: Чему и где я буду учить? Этот факт можно затем использовать в качестве доказательства для вашего анализа синтаксиса wh-вопросов, или семантики глаголов, или, возможно, других теоретических вопросов. В фонологии минимальные пары нацелены не на слова, а на звуки речи.
Маквортер пытался сделать это с всеми английские гласные сразу, собирая то, что, как я полагаю, можно было бы назвать минимальной серией слов, все в форме /bVt/, где V обозначает любую гласную. Вот серия, которую он использовал:
- /i/ свекла
- / ɪ / бит
- /д/ наживка
- / ɛ / ставка
- /æ/ летучая мышь
- / у / загрузки
- /ʊ/ книга
- /п/ лодка
- /ɔ/ купил
- / ɑ / бат
- / ʌ / но
Его серия не идеальна; обратите внимание, что книга нарушает шаблон. Как объясняет Маквортер, «вообще не существует ряда слов, которые начинаются с одного и того же согласного и заканчиваются каким-то одним и тем же другим, включающим все возможные гласные между ними». Это также может объяснить, почему для последнего пункта в списке Маквортер выбрал почти английское слово 9.0131 бат , название тайской денежной единицы. Если бы он этого не сделал, ему пришлось бы выбрать английский бот , который относится либо к интернет-приложению для выполнения повторяющихся задач, либо к личинке овода, и, возможно, он думал, что эти понятия, скорее всего, потребуют объяснения, чем тайские деньги. Конечно, если вы входите в число многих говорящих, у которых кроватка/поймал слияние, купил, бот и бат , все они в любом случае звучат одинаково.
Итак, как видите, попытки найти эти минималистичные наборы доставляют массу удовольствия, острых ощущений и сюрпризов. Одна серия, о которой я думаю время от времени, состоит из односложных слов, начинающихся и заканчивающихся на /k/. Я думаю, это началось, когда я был ребенком, и впервые услышал оскорбление кук /кук/. Меня поразило, что на письме это слово отличалось от слова повар /kʊk/ не заменой двойного O в середине, а заменой C на K! При написании этого поста я также обнаружил, что помимо обозначения сумасшедшего человека,
Будучи подростком, я выучил глагол cack (out) /kæk/ из этого укуса Джорджа Карлина после смерти (начиная с 7:43)–
— но я никогда не слышал, чтобы кто-то еще использовал это выражение, и я не нашел его в поиске по словарю. Впрочем, это нормально, потому что cack может также означать «детскую обувь без каблука с мягкой кожаной подошвой», а также «дерьмо».
Много лет спустя, будучи домовладельцем, я заметил, что сантехники и мастера, с которыми мы имели дело, предпочитают говорить о герметизации столешниц и окон с помощью герметика ing вместо простого герметика . Зная о кроватка/поймал слияние, упомянутое выше, я подозреваю, что они пытаются избежать потенциально неловкой двусмысленности слияния петух/конопатка , потому что они объединили эти гласные или их клиенты. В любом случае, для говорящих, которые сохраняют различие между / ɑ / и / ɔ /, петух / kɑk / и чеканка / kɔk / принадлежат к ряду.
Заполнение остальной части серии, некоторые простые: удар /kɪk/, торт /kek/ и кокс /кок/, но после них дело обстоит сложнее. Тем не менее, в последние несколько лет я был рад видеть появление остальных частей серии. Я узнал об обсерватории Кека на Гавайях. И оказывается, что keek — это слово, используемое в Северной Англии и Шотландии и означающее «подглядывать или смотреть украдкой».
Только одна последняя удерживающая гласная делала мою минимальную серию «К» незавершенной: средне-центральная гласная /ʌ/. Так близко, но увы, cuck не английское слово. Или это?
- /я/ кик
- / ɪ / удар
- /д/ торт
- / ɛ / Кек
- /æ/ cack
- /у/ кук
- /ʊ/ повар
- /п/ кокс
- / ɔ / герметик
- / ɑ / петух
- / ʌ / куколд
Так и есть! Благодаря недавнему росту популярности речей, нападающих на феминизм и политкорректных людей, которые в него верят, я узнал, что cuck действительно английское слово, и оно существует по крайней мере с 2007 года. Это вырезка из рогоносец , архаично звучащий, но все еще актуальный термин для мужчины, чья жена занимается внебрачным сексом. Рогоносец этимологически связан с кукушка , связь заключается в том, что так же, как кукушки заставляют своих невольных жертв обеспечивать потомство кукушки, так и «кукушечный» мужчина может в конечном итоге заботиться о ребенке другого мужчины. В интересной связи с другим предметом в серии kook также может происходить от cuckoo путем вырезания. Но сокращение рогоносец до куколд — это не конец истории. Новое развитие на 2016 год подытожено в этой статье от GQ:
Слово приобрело политическую силу во время выборов 2016 года в портмоне «cuckservative» (cuck + консерватор), которое использовалось для обозначения того, что основные консерваторы разновидности Джеба Буша являются слабый и женоподобный. Дональд Трамп, с другой стороны, не консерватор. Он говорит то, что хочет, и его не волнует, что это оскорбительно. Ссылаясь на комментарии Трампа о том, что у Мегин Келли «кровь течет из нее где угодно», радиоведущий Раш Лимбо язвительно заметил: «Если бы Трамп был обычным республиканцем-рогоносцем, он бы уже извинился».
Но Дональд Трамп не извиняется. Затем он стал кандидатом в президенты от республиканцев, поскольку Джеб Буш, бывший фаворит, был безвозвратно отброшен назад из-за простого оскорбления Трампа, произнесенного с невидимым подмигиванием: «низкоэнергетический».