Я разработал и реализовал язык программирования.
Одна из особенностей этого языка - маскировка функции (в примере кода я называю ее leftBind
) как переменной, так что любая следующая точечная нотация передается в качестве идентификатора.
Изменить: это похоже на метод доступа для класса, за исключением того, что здесь не используется класс. Будет ли применяться здесь тот же термин «получатель» или «аксессор»?
Цель этого языка - предоставить полностью функциональный язык, но ограниченную среду, чтобы разрешить сложные конфигурации проекта, но защитить проект от несанкционированного поведения в целом.
Пример этого:
/*leftbind aliases the identifier “sql” to the function “quote”
It is called leftBind, since it’s binding the left side of the parse tree to a function*/
leftBind(“sql”, “quote”);
q=“select * from foo where user=$sql.user”; // equivalent to quote(user)
Это становится очень удобным для более сложных задач или когда вы хотите встроить часто используемые функции в строки без лишних строк кода, засоряющих вашу программу.
Какая терминология обозначает этот тип поведения?
1 ответ
Если я вас правильно понял, это может быть комбинация строковой интерполяции и динамического поиска членов:
Строчная интерполяция
Например. в Swift вы можете вставлять выражения в код:
"This is \(getAdjective(), uppercasing: true) !"
Эквивалентно
"This is ".append(getAdjective(), uppercasing: true).append(" !")
Определив метод append
для String
, который принимает дополнительные параметры (в данном случае логическое значение uppercasing:
) или принимает другой первый аргумент, вы можете позволить людям расширить этот синтаксис заполнителя.
Вы также можете реализовать метод, который возвращает строку, чтобы вы могли использовать этот метод внутри \(...)
.
Важной частью здесь является то, что существует синтаксис для встраивания выражений в строки, детали того, как Swift его реализует (метод append
на String
- это только то, как это делает Swift, а не то, как должна быть интерполяция строк .
Динамический поиск членов
В Swift класс может определять функцию, которая вызывается при ссылке на член, который не существует как свойство или функция:
@dynamicMemberLookup class MyClass {
var dictionary: [String: String]
subscript(dynamicMember: String) -> String {
return dictionary[dynamicMember] ?? ""
}
}
Это позволяет вам динамически создавать свои собственные переменные. Когда ты пишешь
let foo = MyClass()
let myString = foo.bar
Компилятор в основном просто генерирует код для
let foo = MyClass()
let myString = foo.subscript(dynamicMember: "bar")
Это о чем вы думаете?
Похожие вопросы
Новые вопросы
compiler-construction
Построение компилятора тегов следует применять к вопросам, касающимся программирования компиляторов, или к вопросам о внутренней работе компиляторов. НЕ ИСПОЛЬЗУЙТЕ для вопросов о * использовании * определенных компиляторов или ошибок компиляции.