Объясните конкатенативные языки мне как, я - 8-летний

Если вы обновляете с 0,20 до 0,26 (скажем, обновляете очень старый проект, который не обновлялся годами), вы можете обнаружить, что оба перечисленных ниже предложения, предложенные в других ответах, недостаточны:

  • добавить #import <CoreData/CoreData.h> в pch
  • добавить #import <CoreData/CoreData.h> до #import <RestKit/RestKit.h>

Вместо этого в верхней части соответствующего файла, куда вы импортируете restkit,

// Workaround for bug on RestKit 0.26.0 according to https://github.com/RestKit/RestKit/issues/2352
#ifndef RKCoreDataIncluded 
#define RKCoreDataIncluded 
#endif
27
задан Peter Mortensen 18 June 2012 в 00:37
поделиться

4 ответа

На ваш простой вопрос вот вам субъективный и аргументированный ответ.

Я просмотрел статью и несколько связанных веб-страниц. Веб-страницы сами по себе говорят, что реальной теории нет, поэтому неудивительно, что людям сложно придумать точное и понятное определение. Я бы сказал, что в настоящее время бесполезно классифицировать языки как «конкатенативные» или «не конкатенативные».

Мне это кажется термином, который дает Манфреда фон Туна место, где можно повесить шляпу, но может оказаться бесполезным для других программистов.

Хотя PostScript и Forth заслуживают изучения, я не вижу ничего ужасно нового или интересного в языке программирования Joy Манфреда фон Туна. В самом деле, если вы читаете Криса Окасаки ' В статье Техники встраивания постфиксных языков в Haskell вы можете опробовать все это в обстановке, которая, по сравнению с Joy, является полностью популярной.

Так что мой ответ простого объяснения нет. потому что не существует зрелой теории, лежащей в основе идеи конкатенативного языка. (Как сказали Эйнштейн и Фейнман, если вы не можете объяснить свою идею первокурснику колледжа, значит, вы ее действительно не понимаете.) Я пойду дальше и скажу, что хотя изучение некоторых из этих языков, таких как Forth и PostScript, является умелое использование времени, попытки понять, что именно люди имеют в виду, когда говорят «конкатенативный», вероятно, пустая трата вашего времени.

Итак, мой ответ: нет простого объяснения , потому что нет зрелой теории, лежащей в основе идеи конкатенативного языка. (Как сказали Эйнштейн и Фейнман, если вы не можете объяснить свою идею первокурснику колледжа, значит, вы ее действительно не понимаете.) Я пойду дальше и скажу, что хотя изучение некоторых из этих языков, таких как Forth и PostScript, является умелое использование времени, попытки понять, что именно люди имеют в виду, когда говорят «конкатенативный», вероятно, пустая трата вашего времени.

Итак, мой ответ: нет простого объяснения , потому что нет зрелой теории, лежащей в основе идеи конкатенативного языка. (Как сказали Эйнштейн и Фейнман, если вы не можете объяснить свою идею первокурснику колледжа, значит, вы ее действительно не понимаете.) Я пойду дальше и скажу, что хотя изучение некоторых из этих языков, таких как Forth и PostScript, является умелое использование времени, попытки понять, что именно люди имеют в виду, когда говорят «конкатенативный», вероятно, пустая трата вашего времени.

0
ответ дан 28 November 2019 в 05:23
поделиться

В нормальных языках программирования у вас есть переменные, которые можно определять свободно, и вы вызываете методы, используя эти переменные как аргументы. Их легко понять, но они несколько ограничены. Часто бывает сложно повторно использовать существующий метод, потому что вы просто не можете сопоставить существующие переменные с параметрами, которые нужны методу, или метод A вызывает другой метод B, и A был бы идеальным для вас, если бы вы могли только заменить вызов B с вызовом C.

Конкатенативный язык использует фиксированную структуру данных для сохранения значений (обычно стек или список). Нет переменных. Это означает, что многие методы и функции имеют один и тот же «API»: они работают с чем-то, что кто-то оставил в стеке. Плюс сам код считается «данными», т.е. е. часто пишут код, который может модифицировать себя или который принимает другой код в качестве «параметра» (то есть в качестве элемента в стеке).

Эти атрибуты делают эти языки идеальными для объединения существующего кода для создания чего-то нового. Повторное использование встроено. Вы можете написать функцию, которая принимает список и фрагмент кода и вызывает код для каждого элемента в списке. Теперь это будет работать с любыми типами данных, если они ведут себя как список: результаты из базы данных, строка пикселей из изображения, символы в строке и т. Д.

Самая большая проблема в том, что у вас нет подсказки, что продолжается. Есть только пара типов данных (список, строка, число), поэтому все сопоставляется с ними. Когда вы получаете часть данных, вам обычно все равно, что это такое и откуда. Но это затрудняет отслеживание данных в коде, чтобы увидеть, что с ними происходит.

Я считаю, что для успешного использования языков требуется определенный настрой. Они не для всех.

[РЕДАКТИРОВАТЬ] Форт имеет некоторое проникновение, но не настолько. Вы можете найти PostScript в любом современном лазерном принтере. Так что это нишевые языки.

С функционального уровня они не уступают LISP, C-подобным языкам и SQL: все они Turing Complete , так что вы можете вычислить что угодно. Вопрос только в том, сколько кода вам нужно написать. Некоторые вещи проще в LISP, некоторые проще в C, некоторые проще в языках запросов. Вопрос, что «лучше», бесполезен, если у вас нет контекста.

18
ответ дан 28 November 2019 в 05:23
поделиться

После чтения http://concatenative.org/wiki/view/Concatenative% 20language и опираясь на то немногое, что я помню о вознях с Forth в подростковом возрасте, я считаю, что ключевым моментом в конкатенативном программировании является: вокруг, складывать язык и конкатенативный язык. Оба определяют похожие, но не равные классы языков. Однако по большей части они идентичны.

Большинство языков, широко используемых сегодня прикладные языки: центральные конструкция на языке - это некоторая форма вызова функции, где функция применяется к набору параметров, где каждый параметр сам по себе является результатом вызов функции, имя переменная или константа. В стеке языках, вызов функции выполняется просто напишите имя функция; параметры неявные, и они уже должны быть на стек при вызове. В результат вызова функции (если есть) затем остается в стеке после функция возвращается, для следующего функция потребления и т. д. Потому что функции вызываются просто упоминая их имя без каких-либо дополнительный синтаксис, Forth и Factor называют функции "словами", потому что в синтаксисе они действительно просто слова.

В этом отличие от прикладных языков, которые применяют свои функции непосредственно к определенным переменным.

Пример: сложение двух чисел.

Аппликативный язык :

int foo(int a, int b)
{
    return a + b;
}

var c = 4;
var d = 3;
var g = foo(c,d);

Конкатенативный язык (я сделал он должен быть похож на Форт ...;))

push 4
push 3
+
pop

Хотя я не думаю, что конкатенативный язык = язык стека, как отмечают авторы выше, он кажется похожим.

5
ответ дан 28 November 2019 в 05:23
поделиться

Вы не можете объяснить язык, просто возьмите один ( Factor , желательно) и попробуйте несколько руководств по нему . Учебники лучше, чем ответы на Stack Overflow.

0
ответ дан 28 November 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: