Ваша задача - привязать функцию к языку программирования, либо внедрив очень умную библиотеку, либо обработав вводимый текст и / или изменив процесс компиляции.
Идеи:
- Добавьте чередование презентаций в стиле PHP в C (например
<?c printf("Hello,"); ?> world!
). - Добавьте оператор объединения нулей в один из тех языков, которые не являются C #.
- Добавьте макросы в PHP.
- Добавить
goto
в JavaScript. - Добавить сопоставление с образцом для языка X.
- Добавить поддержку пространства имен для языка, в котором его нет.
- Сделать C похожим на PHP.
- Сделай так, чтобы Хаскелл выглядел как Паскаль.
- ... (не стесняйтесь публиковать идеи в разделе комментариев)
Правила:
- Принеси что-нибудь на стол. Не просто говорите "Template Haskell", чтобы добавить средства метапрограммирования в Haskell. Это не StackOverflow.
- Вся реализация должна умещаться в одном скрине (не считая примера).
- Не размещайте код на внешнем сайте специально для этой задачи.
- Наиболее впечатляющая или удивительная особенность побеждает.
Не беспокойтесь о правильной реализации этой функции. Отнюдь не! Основная задача - выяснить, что вы хотите сделать, и злобно вырезать детали, пока ваше запланированное начинание не станет возможным.
Пример:
Добавьте лямбда-оператор к языку программирования C.
Начальный подход:
Хорошо, я знаю, что хотел бы использовать libgc, чтобы мои лямбды решали проблемы funarg вверх и вниз. Я думаю, первое, что мне нужно сделать, это написать / найти синтаксический анализатор для языка программирования Си, а затем мне нужно узнать все о системе типов Си. Я должен был бы выяснить, как понять это, насколько типы идут. Должен ли я реализовать вывод типа или просто потребовать, чтобы формальный параметр был напечатан как заданный? Как насчет всех этих сумасшедших функций в CI, о которых я еще не знаю?
Совершенно очевидно, что правильная реализация лямбды в C была бы огромной задачей. Забудь о правильности! Упростите, упростите.
Лучше:
Вверните вверх funargs, кому они нужны? Я мог бы сделать что-то хитрое с вложенными функциями GNU C и выражениями операторов . Я хотел продемонстрировать удивительное синтаксическое преобразование на C с помощью краткого хакерского кода, но мне даже не понадобится парсер для этого. Это может подождать еще один день.
Результат (требуется GCC):
#include <stdio.h>
#include <stdlib.h>
#define lambda(d,e)({d;typeof(e)f(d){return(e);};f;})
#define map(F,A)({typeof(F)f=(F);typeof(*(A))*a=(A);({int i,l=((int*)(a))[-1]; \
typeof(f(*a))*r=(void*)((char*)malloc(sizeof(int)+l*sizeof(*r))+sizeof(int)); \
((int*)r)[-1]=l;for(i=0;i<l;i++)r[i]=f(a[i]);r;});})
#define convert_to(T) lambda(T x, x)
#define print(T, fmt) lambda(T x, printf(fmt "\n", x))
int main(void)
{
int *array = 1 + (int[]){10, 1,2,3,4,5,6,7,8,9,10};
map(print(int, "%d"), array);
double *array2 = map(lambda(int x, (double)x * 0.5), array);
map(print(double, "%.1f"), array2);
long *array3 = map(convert_to(long), array2);
map(print(long, "%ld"), array3);
long product = 1;
map(lambda(int x, product *= x), array);
printf("product: %ld\n", product);
return 0;
}
Это было легко, не так ли? Я даже добавил map
макрос, чтобы сделать его полезным и красивым.
источник
Ответы:
Синтаксис ООП в Хаскеле
Объекты могут иметь свойства:
... и методы:
источник
&
и определен так(&) = flip ($)
.&
потому что это унарный оператор 'address-of' (реализация указателей в Haskell оставлена в качестве упражнения для читателя).flip id
goto
в JavaScript?Моей первой мыслью был функциональный подход - добавить параметр в функцию, чтобы указать, где должно начинаться выполнение, используя его с
switch
оператором и внешним циклом, многократно вызывающим функцию для ее собственного возвращаемого значения . К сожалению, это исключает использование локальных переменных, поскольку они теряют свои значения при каждом переходе.Я мог бы использовать
with
оператор и переместить все объявления переменных в начало функции, но должен был быть лучший путь. В конце концов мне пришло в голову использовать обработку исключений в JavaScript . На самом деле, Джоэл Спольски сказал: «Я считаю, что исключения не лучше, чем« goto's ... » - очевидно, идеально подходят.Идея заключалась в том, чтобы поместить внутри функции бесконечный цикл, завершаемый только
return
оператором или необработанным исключением. Все gotos, рассматриваемые как исключения, будут перехвачены в цикле, чтобы предотвратить его завершение. Вот результат этого подхода:Вы можете использовать его следующим образом - даже в строгом режиме ES5 - за исключением Internet Explorer ( демо ):
[Internet Explorer по какой-то причине не может оценить код анонимной функции, поэтому нужно было бы присвоить этой функции имя (до перезаписи) и вызывать ее, используя это имя. Конечно, это, вероятно, нарушило бы строгие правила режима.]
Это не позволяет переходить к оператору, расположенному внутри блока (до тех пор, пока такие конструкции, как устройство Даффа, не станут легальными), но мы можем справиться с этим (другая, самопроизвольно переписанная функция), верно?
источник
goto
была полностью реализована в JavaScript (там, где вы могли бы использовать ееgoto
для выпрыгивания из любой области видимости, даже из функции ), это подразумевало бы поддержку продолжений.#define в Java
Я думал, что было бы интересно реализовать макросы на Java.
Пример использования (преобразует в ранее опубликованный код; давайте сделаем его странным):
источник
Foreach в C
Итерация массивов (работает со статическими массивами, а не с массивами, полученными через указатель)
Чтобы проверить это:
результат:
источник
Недвижимость в С
Томаш Вегжановски реализовал свойства в простом C, преднамеренно сегментируя программу при обращении к свойству.
Объект со «свойством» настраивается путем создания объекта,
struct
который пересекает несколько страниц, гарантируя, что адрес памяти свойства находится на странице, отличной от реальных элементов данных. Страница свойства помечена как недоступная, что гарантирует, что попытка получить доступ к свойству приведет к ошибке. Затем обработчик ошибок выясняет, какой доступ к свойству вызвал segfault, и вызывает соответствующую функцию для вычисления значения свойства, которое сохраняется по адресу памяти свойства.Обработчик ошибок также помечает страницу данных как доступную только для чтения, чтобы гарантировать, что вычисленное значение остается согласованным; когда вы в следующий раз попытаетесь выполнить запись в элемент данных, это вызовет ошибку сегмента, обработчик которой устанавливает страницу данных для чтения-записи и страницу свойств как отсутствие доступа (что указывает на необходимость пересчета).
источник
Компьютерная версия в Common Lisp
Я изначально реализовал Come-From. Но этого было недостаточно.
Вдохновленный вычисленным goto, я решил реализовать вычисленный исходящий.
Примеры использования
Для каждого объявления прихода в tagbody он будет проверять на каждой метке, равна ли переменная прихода текущей метке, и, если это так, переходить к соответствующему объявлению прихода.
Greeter
FizzBuzz
источник
"Авто-струны" в рубине
Код довольно прост:
Теперь вы можете сделать
источник
Добавить макросы в PHP
Мы можем просто использовать препроцессор C для этой задачи.
PHP-скрипт:
Труба это хотя cpp:
Результат:
источник
<<<HEREDOC
- это не более чем 3 смещения ниже или влево и идентификатор :-) Это, однако, сделает макрос-замену в строках heredoc.grep -v ^#
Whould исправить это. Я думаю, этого достаточно для этого вопроса :-)Сопоставление паттерновв PythonТело функции состоит из 288 символов.
Паттерны соответствия паттерновпозволяют использовать совершенно разные функции в зависимости от значений аргументов. Хотя это можно легко эмулировать с помощью рядаif
операторов,защитники сопоставления с образцоммогут помочь разделить фрагменты кода, и это отличный повод, чтобы заняться сумасшедшим метапрограммированием.pattern_match
это декоратор, который создает новую функцию, которая реализует охранусопоставления с образцом. Условия для каждой «подфункции», заданной в каждой строке документации в строках, начинающихся с pipe (|
). Если все условия оцениваются верно, эта версия функции запускается. Функции проверяются по порядку, пока не будет найдено совпадение. В противном случаеNone
возвращается.Пример поможет уточнить:
источник
f [a,b,c] = ...
, что не только проверяет аргумент против предиката, но и связывает соответствующие переменные при успешном сопоставлении. Это все еще довольно круто, хотя.f (x:xs) = ...
иf [] = ...
). Каким-то образом я запутал охранников там, но именно там я взял|
.сопрограммная
Я не могу взять кредит на это, поэтому я отметил это CW.
Сопрограммы в Си Саймоном Тэтэмом
источник
Таможенные операторы в Lua
Pogs ловко злоупотребляет перегрузкой операторов в Lua , чтобы можно было определять пользовательские инфиксные операторы. Я расширил это, чтобы поддерживать секционирование оператора (частично применяя оператор с любым операндом) и вызывая полученный объект, как если бы он был функцией.
источник
Многострочные строки в JavaScript
в этом сложном синтаксисе для многострочных строк перед каждой многострочной строкой будет стоять
(function(){/*
и символ новой строки, а затем символ новой строки и*/}+'').split('\n').slice(1,-1).join('\n')
.используя этот удивительный, интуитивно понятный синтаксис, мы наконец можем использовать многострочные строки:
для людей, которым не нравится наш простой синтаксис, у нас есть компилятор для нашего сказочного нового языка:
тот же пример в версии на скомпилированном языке:
источник
*/
свои многострочные строки. Это очень раздражает при включении регулярных выражений в строках!Sliceable List в C # (например, Python)
Мне всегда нравилась нотация питона и хотелось бы, чтобы она была доступна в C #
Использование:
Код, далекий от доказательства ошибки:
источник
Сделать C проще
Этот код позволяет вам писать программы на C, которые немного напоминают язык сценариев. Он содержит ключевые слова, такие как «var», «is», «string», «plus», «equal» и ряд других. Он работает через множество определений.
Это позволяет вам писать код как:
Вышеизложенное расширяется до:
Вероятно, не слишком полезный, но мне показалось довольно интересным, что вы могли бы по существу создать целый язык программирования с помощью набора
#define
s.источник
#define
s вы можете даже дать своему языку такие вещи, как обработка исключений и сборка мусора , сохраняя при этом фундаментальный уровень C под ним.Tcl
Tcl не имеет
do ... while
илиdo ... until
так ...Пример:
uplevel
выполняет скрипт в области действия вызывающихисточник
Перейти в PostScript
Моей первой мыслью было, что мне придётся разбираться со стеком exec, поэтому при этом фальстарте выкапывается оператор продолжения для остановки из ghostscript (или xpost).
Но это проще, чем это. Поскольку положение файла одинаково для всех дубликатов дескриптора файла (использует
setfileposition
его аргумент, так что это единственная полезная семантика для этой функции).Это печатает
5
.Есть некоторые ограничения с вышеуказанным. Переход не является немедленным, но происходит, когда if-body возвращается на верхний уровень и интерпретатор снова читает из файла (вместо чтения из массива, содержащего if-body). В этот момент файл был перемещен, и «goto» вступает в силу.
источник
currentfile <pos> setfileposition
, считая байты от начала файла.Symbol#to_proc
с аргументами в RubySymbol#to_proc
Вероятно, это один из моих любимых приемов написания действительно лаконичного кода на Ruby. Предположим, у вас естьи вы хотите преобразовать содержимое
nums
иtext
в Floats и прописные слова, соответственно.Symbol#to_proc
позволяет сократить код следующим образом:к этому:
Потрясающие! Но что , если мы хотим поднять каждый элемент
nums
к -i
й степени, или заменить каждое вхождениеs
с*
вtext
? Есть ли способ сократить код, как это?Увы, нет простого способа передать аргументы при использовании
Symbol#to_proc
. Я видел, что это было сделано несколькими способами, но, вероятно, два из самых умных и полезных включают в себя мартовское исправлениеSymbol
класса [ 1 , 2 ]. Я проиллюстрирую первый способ ниже.Теперь вы можете делать такие вещи, как:
источник
JavaScript foreach
Выход
Альтернативный синтаксис, больше похожий на Tcl.
источник
Gotos в Хаскелл
Основная идея заключается в том, что gotos можно частично смоделировать, используя последний оператор в
do
-notations. например:эквивалентно
поскольку выполнение будет переходить к последнему утверждению, оптимальным является выражение gotos.
потому что, как это сделано, gotos прыгает только тогда, когда они находятся
do
непосредственно в блоке определения верхнего уровня. это на самом деле «вызвать х и игнорировать остальную часть увиденного лексически утверждений», а не «все x и игнорирование остальных утверждений», как настоящий goto.самая большая проблема заключается в том, что, когда нет способа покинуть выполнение с середины действия ввода-вывода - даже
return
нет;return
ничего не делает, когда это не последнее утверждение.это преодолевает это, захватывая остальные операторы другим
do
блоком.становится
print 3
заявление захватываетсяdo
блоком, поэтомуloop
становится последним утверждением.это преобразование также поддерживает переменные, присутствующие в области действия. это делается путем запоминания переменных, находящихся в области видимости, и передачи их в действия. например:
это просто переводится на:
некоторые заметки:
также добавлен
return undefined
оператор, чтобы гарантировать, чтоdo
блок захвата не пустой.потому что иногда в
do
блоке захвата присутствует неоднозначность типа , а неconst
мы используемasTypeOf
, что то же самое,const
но требует, чтобы оба его параметра имели одинаковый тип.фактическая реализация (в javascript):
экзамен:
будет выглядеть так:
выход:
источник
return
в Haskell это обычная функция, не связанная с ключевым словом в C / etc.Python Goto
goto.py
использование
Образец теста
Пример тестового примера
Немного веселья с exec (). Может вызвать ошибку максимальной глубины рекурсии, если не используется должным образом.
источник
// импортируем JavaScript без специального использования тега script на странице HTML
Это хромает, да, я знаю. Длина: 99
источник
script
пометки вокруг. Тогда где именно эта новая функция?