Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 02:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Может быть, попытаешься найти в исходниках ответ на свой глупый вопросец?
Очевидно, что реализация стандартного filter не такая как у тебя и в скоупе нет имени result:
Error: undefined identifier result
А может быть ты, Лев Толостой, покажешь как в твоей реализации сделать так, что бы в скоупе оказался только number?

Добавлено через 2 минуты
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Ну я не виноват, что лисперы не могут решить проблему ромба в отличие от D-шников
В CLOS нет этой проблемы.

Добавлено через 12 минут
Dennis Ritchie, полистал сейчас phobos. Это просто пипец. Punks not dead. Куча закомменченных сорцов и сплошные комменты - Not yet implemented. Код написан отвратно. 15 лет языку. Это победа, я считаю
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.05.2015, 02:59
Ответы с готовыми решениями:

Common Lisp vs D
Может быть, попробуем затеять холиварчик. Чтобы было менее честно, можно противопоставлять языку D все языки семейства лисп. Чтобы было...

C++ vs Common Lisp: кодогенерация, метапрограммирование
Дано описание произвольного математических выражений на XML вида: <calc> <mul> <var>k</var> ...

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и Common Lisp.Только не всякие...

133
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
19.05.2015, 03:16
Цитата Сообщение от nullxdth Посмотреть сообщение
Очевидно, что реализация стандартного filter не такая как у тебя и в скоупе нет имени result:
Боюсь, что твой мозг не потянет настоящий filter!
Цитата Сообщение от nullxdth Посмотреть сообщение
А может быть ты, Лев Толостой, покажешь как в твоей реализации сделать так, что бы в скоупе оказался только number?
Я круче, чем Лев Толстой и Пушкин, поэтому реализовал фичу в одно строку! Учись, лиспер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import std.stdio, std.string;
 
int[] filter(string predicate)(in int[] numbers) {
    
    static assert(predicate.split[0] == "number");
    
    int[] result;
    
    foreach (number; numbers) {
        if (mixin (predicate)) {
            result ~= number;
        }
    }
 
    return result;
}
 
void main() {
 
    int[] numbers = [ 1, 8, 6, -2, 10 ];
    
    int[] chosen = filter!"result == [ 1, 8, 6 ]"(numbers);
    
    writeln(chosen);
}
http://rextester.com/TNY10933
Цитата Сообщение от nullxdth Посмотреть сообщение
полистал сейчас phobos.
На github'e листал?
Цитата Сообщение от nullxdth Посмотреть сообщение
Куча закомменченных сорцов и сплошные комменты - Not yet implemented.
А что в этом плохого?

Не по теме:

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
покажешь как в твоей реализации сделать так, что бы в скоупе оказался только number?
Подчинительный союз чтобы в данном случае можно заменить составным союзом для того чтобы, поэтому в данном случае чтобы пишется слитно. Уяснил?

0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 07:16
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
поэтому реализовал фичу в одно строку!

паааарсить выражение таким образом - это сильно! Вместо ограничения скоупа Дениска ограничивает программистов в написании предиката... Ему так удобнее... А если там будет что-то вроде
C++
1
fabs(number) > x
?
Или
C++
1
number != number + 1 && result != [1, 8, 6]
?

В общем, это костыль костылей. Ну да для D - сойдёт.

Добавлено через 1 минуту
http://rextester.com/THII61903
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
19.05.2015, 08:25
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Какую полезную работу можно делать на лиспе?
а ты у Новака спроси. он же листер по твоему. от пусть и доказывает что он лиспер.

Не по теме:

Цитата Сообщение от nullxdth Посмотреть сообщение
phobos. Это просто пипец
так там же всё такое
основная либа не зря зовется phobos, что в переводе страх.
да я язычек в реале не digital mars, а циферный марс срам

0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
19.05.2015, 10:50
C++
1
int[] filter(string predicate)(in int[] numbers) {


Для каждого типа заново писать фильтр?
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 14:27
korvin_, ну это поправимо. Куда хуже то, что скоуп неограничен

http://rextester.com/EOXVW95995

Добавлено через 6 минут
Собственно, можно так.
Но это тоже бред...

http://rextester.com/JOLD76412

Добавлено через 2 минуты
В нормальном языке я применил бы обычный плюсовый подход, вроде того:
http://rextester.com/XNDFY20437

Но это же не Денискин путь, ему нужно генерить функцию из строки, это же миксины, это же круто...
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
19.05.2015, 15:58
Цитата Сообщение от FraidZZ Посмотреть сообщение
ну это поправимо. Куда хуже то, что скоуп неограничен
Угу, просто про скоуп уже писали. + Как я понимаю, пользователь такого «фильтра» вынужден будет догадываться, какое там имя должно быть у переменной? И, т.к. оно жестко вшито, то перекроет переменную с таким же именем или что? В общем, да, Дэ-нискин путь такой путь. =)
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 17:09
korvin_, да-да. Потому есть вариант генерить миксином литерал функции из строки, но опять же. Либо передавать имя ещё одним параметром, либо хз как там.

Овчинка не стоит выделки.

Добавлено через 4 минуты
Есть вариант использовать общую часть объявления
C++
1
function bool
как вшитый в шаблон параметр, но это уже костыли верхом на велосипеде.

http://rextester.com/PKTDT31004
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
19.05.2015, 17:17
Я правильно понял, что миксины, по-лисповому говоря, негигиеничные, и что gensym-а нет?
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 17:32

Не по теме:

helter, как не для лиспера лучше расшифруй)



Добавлено через 3 минуты
Про gensym почитал. Не думаю, что это есть в D, но это легко реализуется в Руби.

Добавлено через 6 минут
Вроде того:
Ruby
1
2
3
4
5
6
7
class Gensym
    @@symbolCounter = 0
    def Gensym.next
        @@symbolCounter += 1
        ("G" + @@symbolCounter.to_s).to_sym 
    end
end
Только мне сложно придумать этому практическую область применения - по крайней мере, в самом Руби
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
19.05.2015, 17:40
В негигиеничных макросах могут захватываться окружающие символы, что может приводить к конфликтам. По идее, об этом надо подробно говорить, но я только приведу пример (из Let Over Lambda - там, соответственно, есть подробно). Пусть макрос nif (numeric if) возвращает результат одного из трёх выражений в зависимости от знака аргумента. Наивная реализация такая:
Lisp
1
2
3
4
5
(defmacro nif-buggy (expr pos zero neg)
  `(let ((obscure-name ,expr))
     (cond ((plusp obscure-name) ,pos)
           ((zerop obscure-name) ,zero)
           (t ,neg))))
где результат вычисления выражения expr сохраняется во вспомогательной переменной obscure-name. Вот пример, во что этот макрос может раскрываться
Lisp
1
2
3
4
5
(nif-buggy (+ a b) "positive" "zero" "negative")
=>
(LET ((OBSCURE-NAME (+ A B)))
  (COND ((PLUSP OBSCURE-NAME) "positive") ((ZEROP OBSCURE-NAME) "zero")
        (T "negative")))
Однако если в клаузах есть символ obscure-name, могут быть конфликты. Например,
Lisp
1
2
3
4
5
6
(let ((obscure-name "positive"))
  (nif-buggy
    100 
    obscure-name
    "zero"
    "negative"))
должно бы вычислиться в "positive", но из-за конфликта возвращается 100. Функция gensym генерирует символы, которые не приведут к конфликтам.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 17:43
helter, угу, ясно. В Руби это действительно не найдёт применения, так как там нет макросов. А функции и блоки обладают закрытыми скоупами.

Миксины же D просто вставляют вычислимую на этапе компиляции строку в исходник. Так что ни о каких закрытых скоупах и речи быть не может)
Нет, всё же не совсем так. Строка должна быть синтаксически законченным выражением на D
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
19.05.2015, 17:44
Да, вот неглючное определение:
Lisp
1
2
3
4
5
6
(defmacro nif (expr pos zero neg)
  (let ((g (gensym)))
    `(let ((,g ,expr))
       (cond ((plusp ,g) ,pos)
             ((zerop ,g) ,zero)
             (t ,neg)))))
Обратная кавычка ` задаёт "шаблон", а символ, перед которым стоит запятая - подставляется в шаблон. Например, если a равно 3, то `(1 2 ,a) есть (1 2 3).

Добавлено через 1 минуту
А макрос - это просто обычная функция, которая преобразует код где-то во время компиляции. Ведь код есть данные, и макрос просто перекраивает списки.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 17:50
helter, жаль, что не могу здесь поставить спасибо. Инфа действительно интересная.

Добавлено через 4 минуты
Что интересно - на офф.сайте D написано следующее:
C macros cut across all scopes. This problem is called being not "coding hygenic". Mixins follow the usual scoping rules, and is hygenic.
А наблюдается обратное.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
19.05.2015, 17:59
Цитата Сообщение от FraidZZ Посмотреть сообщение
This problem is called being not "coding hygenic".
Как обычно, проблема не в отсутствии гигиены, а в программистах. Даг Хойт (автор Let Over Lambda) о гигиеничных макросах: "It is a lot harder to shoot yourself in the foot when your hands are tied behind your back."
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 18:08
Цитата Сообщение от helter Посмотреть сообщение
Как обычно, проблема не в отсутствии гигиены, а в программистах.
Ага, но совершенно не ясно как загенсимить или каким-нибудь образом ограничить scope в D. Всё усложняется ещё и тем, что конструкция создающая scope в D - это statement.

Добавлено через 5 минут
Но я почти уверен, что в D как-то можно это сделать, развернуть миксин в лямбде без замыканий, например. Но такое-то метапрограммирование из приятного занятия в Lisp превращается а адову ссанину в D.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 18:14
Цитата Сообщение от nullxdth Посмотреть сообщение
Но я почти уверен, что в D как-то можно это сделать, развернуть миксин в лямбде без замыканий, например.
Да вот так, я уже показывал вроде:
http://rextester.com/JOLD76412

Правда, к скоупу самого миксина это не имеет отношения. Просто литерал функции не захватывает переменные из внешнего: http://rextester.com/ZQX2886
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 18:16
Цитата Сообщение от FraidZZ Посмотреть сообщение
Да вот так, я уже показывал вроде
Ага, точно. Только:
Code
1
function bool(string a) {return ... }
должен быть в принимающей миксин функции.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
19.05.2015, 18:40
Так что вариант Дэ-ниски можно оптимизировать как-то так. Но выглядит всё равно мерзко и запитано от костылей.
http://rextester.com/OFEVBM18747

Добавлено через 1 минуту
nullxdth, я и так делал. Тогда встаёт вопрос как передавать имя входной переменной. Вот, ссылкой выше я сделал передачей в шаблон ещё одного параметра. Но всё равно - это же такая кривизна подхода. А кто-то этим гордится

Добавлено через 1 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Code
1
function bool(string a)
Вопрос - как варьировать имя переменной a ? Только обернув всю функцию в миксин... монструозность.

Добавлено через 19 минут
Или так: http://rextester.com/YKBCE95197
Я бы сказал, чем там пахнет. Но так как D, пояснения не нужны.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 18:52
Цитата Сообщение от FraidZZ Посмотреть сообщение
Да не, можно что-нить покрасивее, например: http://rextester.com/GSMB5015
Ну и it протащить параметром, как ты это сделал (по-уродски, строчным литералом).

Добавлено через 3 минуты
Цитата Сообщение от nullxdth Посмотреть сообщение
Да не, можно что-нить покрасивее, например: http://rextester.com/GSMB5015
Кстати, не понятно почему это работает, ведь function теоретически не должен ничего замыкать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2015, 18:52

Common lisp
кто поможет решить эти задачи? Перечитайте правила форума. Один вопрос - одна тема. Заголовок темы должен быть осмысленным и...

Common Lisp
Подскажите пожалуйста, а может Common Lisp формировать списки из функций, и (если вдруг может) как?

Common lisp
Есть фрагмент программы: (defun game(x y) (cond (( < x y)(print "menshe")(setq y (read))) (( > x y)(print "bolshe")(setq y...

ООП Common Lisp
Помогите пожалуйста! Реализовать класс: Программа (название, тип, сфера применения, язык программирования, ...) Класс должен иметь...

Программа на common lisp
Программа на common lisp Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа обнулить нулевой и седьмой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru