Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
19.05.2015, 18:58 101
Author24 — интернет-сервис помощи студентам
nullxdth, так function таки и не замыкает. Значение пожирает миксин.

Добавлено через 1 минуту
Вот как это реализовано в D:

std.functional.d
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
template unaryFun(alias fun, string parmName = "a")
{
    static if (is(typeof(fun) : string))
    {
        static if (!fun._ctfeMatchUnary(parmName))
        {
            import std.traits, std.typecons, std.typetuple;
            import std.algorithm, std.conv, std.exception, std.math, std.range, std.string;
        }
        auto unaryFun(ElementType)(auto ref ElementType __a)
        {
            mixin("alias " ~ parmName ~ " = __a ;");
            return mixin(fun);
        }
    }
    else static if (needOpCallAlias!fun)
    {
        // Issue 9906
        alias unaryFun = fun.opCall;
    }
    else
    {
        alias unaryFun = fun;
    }
}
std.algorithm.iterator.d
C++
1
2
3
4
5
6
7
template filter(alias predicate) if (is(typeof(unaryFun!predicate)))
{
    auto filter(Range)(Range range) if (isInputRange!(Unqual!Range))
    {
        return FilterResult!(unaryFun!predicate, Range)(range);
    }
}
Добавлено через 32 секунды
Цитата Сообщение от nullxdth Посмотреть сообщение
как ты это сделал (по-уродски
Как-то звучит нехорошо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2015, 18:58
Ответы с готовыми решениями:

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

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

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

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

133
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 19:00 102
Цитата Сообщение от FraidZZ Посмотреть сообщение
Как-то звучит нехорошо
Имеется ввиду, что в D не сделать по другому
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.05.2015, 19:01 103
Кстати genSym в Nim eсть например:
Bash
1
2
3
4
5
6
7
8
9
10
11
import macros
 
macro m(): stmt = 
  result = newStmtList(
    newVarStmt(genSym(nskVar, "foo"), newIntLitNode(0)),
    newVarStmt(genSym(nskVar, "foo"), newIntLitNode(3)))
  echo repr(result)
 
m() # ok, output: var foo = 0 var foo = 3
var foo = 0
var foo = 3 # fail, output: Error: redefinition of 'foo'
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 19:07 104
Цитата Сообщение от FraidZZ Посмотреть сообщение
Значение пожирает миксин.
Не очень понимаю, я внутри лямбды без замыканий ссылаюсь на строку p. Как так получается?

Добавлено через 57 секунд
Цитата Сообщение от ct0r Посмотреть сообщение
Кстати genSym в Nim eсть например
Не удивительно. Lisp influenced

Добавлено через 3 минуты
Цитата Сообщение от FraidZZ Посмотреть сообщение
Вот как это реализовано в D
Ага, посмотрел уже. Адова жесть.
0
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
19.05.2015, 19:08 105
Цитата Сообщение от nullxdth Посмотреть сообщение
я внутри лямбды без замыканий ссылаюсь на строку p
Ну так она ж в шаблоне, а не аргументах.

Добавлено через 26 секунд
Ну, в смысле, она не передаётся в скоуп при вызове, а инстанциирует шаблон. Это можно.

Добавлено через 24 секунды
Цитата Сообщение от nullxdth Посмотреть сообщение
Имеется ввиду, что в D не сделать по другому
Да я понял, просто намекнул на формулировку
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 19:09 106
Цитата Сообщение от FraidZZ Посмотреть сообщение
Значение пожирает миксин.
В смысле? Т.е. конструкции mixin насрать на скоупы?

Добавлено через 25 секунд
Цитата Сообщение от FraidZZ Посмотреть сообщение
Ну так она ж в шаблоне, а не аргументах.
А. Понял.
0
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
19.05.2015, 19:10 107
Цитата Сообщение от FraidZZ Посмотреть сообщение
Значение пожирает миксин.
Я тогда вообще не понял, о чём речь идёт. Только после
Цитата Сообщение от nullxdth Посмотреть сообщение
я внутри лямбды без замыканий ссылаюсь на строку p. Как так получается?
понял суть вопроса
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.05.2015, 19:16 108
А вот если бы в D были AST макросы, как в Rust, тут уже можно было бы о чём-то разговаривать. Из говённого D можно было бы сделать что-нибудь более или менее потребное. Например, добавить PM.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.05.2015, 22:34 109
В Rust конечно же тоже есть gensym:
C++
1
2
3
4
5
6
7
8
9
10
11
#![feature(rustc_private)]
extern crate syntax;
 
use syntax::parse::token::gensym;
 
fn main() {
    let s = "foo";
    let name1 = gensym(s); // returns syntax::ast::Name
    let name2 = gensym(s);
    println!("{}", name1 == name2); // false
}
0
331 / 199 / 9
Регистрация: 12.05.2015
Сообщений: 334
20.05.2015, 12:39 110
Цитата Сообщение от helter Посмотреть сообщение
слабых хэш-таблиц (в стандарте CL их тоже нет, но в SBCL есть).
Строго говоря если смотреть внутрь trivial-garbage унифицирующую это дело, то они есть в всех живых реализациях. Кто бы это конечно это все тестировал и нам рассказывал

Добавлено через 1 час 39 минут
Цитата Сообщение от Lambdik Посмотреть сообщение

Не по теме:


Lisp
1
(format t "~v@{~v@{~A~:*~}~:*~%~}" 4 7 '*)
Этот код слаще медовых сот. ©
:)

Можно так
Lisp
1
2
3
4
5
(with-fmt (t) 
  (:esc 
    (loop :repeat 7 
          :do (:fmt (:times #\* 5) 
                 #\Newline))))
Ставить fmt соответствено из ql. Новый/Старый format c расширениями, плюшками и собствеными неидеальностями. Ктобы еще ему намекнул что-бы он :times поправил наоборот
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
25.05.2015, 17:53 111
У кого-нибудь из лисперов есть желание перекатать эту задачу на Lisp'е или на Rust'е? Ведь эти два языка позволяют возвращать выражения прямо из условного оператора и циклов, выходит эта задача может быть реализована короче на Lisp'е или Rust'е:
D vs C++ (2)
P.S. А, может быть, наоборот докажет, что возврат выражений из циклов и if'ов бесполезен!
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
У кого-нибудь из лисперов есть желание перекатать эту задачу на Lisp'е или на Rust'е?
Хотя здесь нужен Самуил Астероидович, ибо задачки про яблоки — это его конёк!
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
25.05.2015, 18:23 112
В коде на D вообще ничего не возвращается. Мы так писали программы на паскале в девятом классе до того как прошли функции/процедуры — всё совали между бегин—энд. Если бы хотя бы разнести вычисления и ввод/вывод, можно было бы что-то сравнивать.
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
25.05.2015, 18:50 113
Цитата Сообщение от helter Посмотреть сообщение
В коде на D вообще ничего не возвращается.
Как бы и не должно! D основан на плюсах, а не на лиспе.
0
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
25.05.2015, 19:33 114
Модульность кода - это плохо?
D-way такой D-way.

Хотя меня терзают смутные сомнения, что виноват в этой кривоте не сам язык D, а исключительно наш Дениска.
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
25.05.2015, 19:36 115
Цитата Сообщение от helter Посмотреть сообщение
Если бы хотя бы разнести вычисления и ввод/вывод, можно было бы что-то сравнивать.
Не вопрос :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import std.stdio, std.algorithm, std.range;
 
void solve(Range)(Range r) {
    cartesianProduct(r, r, r).filter!(i => i[0] * (y + 3 * z) + i[1] * (y + 2 * z) + i[2] * (y + z) == s).each!dout;
}
 
const x = 12, y = 65, z = 50, s = 1435;
 
void main() {
 
    auto a = iota(0, x + 1).array;
 
    solve(a);
}
 
auto dout(Tuple)(Tuple idx) {
    writefln(`%s яблок`, idx[0] + idx[1] + idx[2]);
    writefln(`%s пряников`, idx[0] * 3 + idx[1] * 2 + idx[2]);
    writefln(`%s глотков чая`, idx[0] * 3 + idx[1] * 2 + idx[2]);
    writefln("Кислых: %s; полукислых: %s; сладких: %s.\n", idx[0], idx[1], idx[2]);
}
http://rextester.com/SUCXN13987
Output9 яблок
17 пряников
17 глотков чая
Кислых: 0; полукислых: 8; сладких: 1.

9 яблок
17 пряников
17 глотков чая
Кислых: 1; полукислых: 6; сладких: 2.

9 яблок
17 пряников
17 глотков чая
Кислых: 2; полукислых: 4; сладких: 3.

9 яблок
17 пряников
17 глотков чая
Кислых: 3; полукислых: 2; сладких: 4.

9 яблок
17 пряников
17 глотков чая
Кислых: 4; полукислых: 0; сладких: 5.
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
25.05.2015, 21:35 116
Да тут и циклы не нужны!

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun calc-counts (total-weight keys &aux results)
  (labels ((calc (left-weight keys-count keys)
             (cond ((= left-weight 0)
                    (push keys-count results))
                   ((and (> left-weight 0) (consp keys))
                    (destructuring-bind (key &rest rest-keys) keys
                      (calc (- left-weight (key-weight key))
                            (add-key keys-count key)
                            keys)
                      (calc left-weight keys-count rest-keys))))))
    (calc total-weight (make-counts keys) keys)
    results))
Кликните здесь для просмотра всего текста
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun make-counts (keys)
  (loop :for key :in keys
        :collect (cons key 0)))
 
(defun add-key (counts k)
  (loop :for (key . count) :in counts
        :collect (cons key (if (eq key k) (1+ count) count))))
 
(defun get-key-count (counts k)
  (cdr (assoc k counts)))
 
(defun key-weight (k)
  (get k :weight))
 
(defun (setf key-weight) (w k)
  (setf (get k :weight) w))


Lisp
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
(defconstant cake&tea-weight 50)
(defconstant    apple-weight 65)
 
(setf (key-weight 'sour)      (+ apple-weight (* 3 cake&tea-weight)))
(setf (key-weight 'half-sour) (+ apple-weight (* 2 cake&tea-weight)))
(setf (key-weight 'sweet)     (+ apple-weight      cake&tea-weight) )
 
(defparameter *fmt*
  "~%Result #~d
  Sour      apples: ~4d
  Half-sour apples: ~4d
  Sweet     apples: ~4d
  Total apples: ~d, cakes: ~d, tea drinks: ~d
")
 
(defun main ()
  (let ((results (calc-counts 1435 '(sour half-sour sweet))))
    (loop :for i :upfrom 1
          :for result :in results :do
          (let* ((sour   (get-key-count result 'sour))
                 (half   (get-key-count result 'half-sour))
                 (sweet  (get-key-count result 'sweet))
                 (apples (+ sour half sweet))
                 (c&t    (+ (* 3 sour) (* 2 half) sweet)))
            (format t *fmt* i sour half sweet apples c&t c&t)))))
Lisp
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
26
27
28
29
Result #1
  Sour      apples:    0
  Half-sour apples:    8
  Sweet     apples:    1
  Total apples: 9, cakes: 17, tea drinks: 17
 
Result #2
  Sour      apples:    1
  Half-sour apples:    6
  Sweet     apples:    2
  Total apples: 9, cakes: 17, tea drinks: 17
 
Result #3
  Sour      apples:    2
  Half-sour apples:    4
  Sweet     apples:    3
  Total apples: 9, cakes: 17, tea drinks: 17
 
Result #4
  Sour      apples:    3
  Half-sour apples:    2
  Sweet     apples:    4
  Total apples: 9, cakes: 17, tea drinks: 17
 
Result #5
  Sour      apples:    4
  Half-sour apples:    0
  Sweet     apples:    5
  Total apples: 9, cakes: 17, tea drinks: 17
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
25.05.2015, 21:55 117
Цитата Сообщение от korvin_ Посмотреть сообщение
Да тут и циклы не нужны!
Молодец! Молодец, но...
Решение непонятное, большое и сложное, и непонятное.
P.S. Кстати, я смог установить компилятор лиспа (он работает), но вот с настройкой emacs'а опять траблы, потому что emacs написан на Lisp'е.
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
25.05.2015, 22:06 118
Цитата Сообщение от korvin_ Посмотреть сообщение
не обязательно постоянно об этом напоминать.
Зачем calc-counts? В стандартной библиотеке лиспа нет картезианского произведения?
И вообще убери слово defun (дефан, дефун) из своего кода, ведь оно очень смешно звучит/читается/говорится/etc.
0
Eva Rosalene
25.05.2015, 22:57
  #119

Не по теме:

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
В стандартной библиотеке лиспа нет картезианского произведения?
У Дениски новая игрушка. Теперь он будет бегать в песочнице, трясти ей и дразниться, пока не разобьёт.

0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
25.05.2015, 23:41 120
...

Добавлено через 1 минуту
Моё сообщение помножилось на 0. Придётся заново написать.

Добавлено через 8 минут
Ещё одно лисповое решение. Захотелось продемонстрировать пресловутый list processing. Я записываю данные задачи в виде списков в произвольной форме и играюсь с этой информацией. Это очень простой и поэтому мощный подход: представлять данные, да и условие задачи в целом в виде удобной формы списков, с использованием символов. Манипулировать этими данными несложно; макросы позволяют превращать их в код ― их, то есть списки произвольной удобной формы. Так создаются DSL. Применимость лиспа к сложным задачам происходит от ненавязчивости лиспа, способности принять любую форму.

Lisp
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;;; Записываю условие в виде списков, как пришло в голову
(defparameter *weights* '((apple 65)
                          (cake 30)
                          (drink 20)))
(defparameter *sets* '((sour (cake 3) (drink 3))
                       (not-so-sour (cake 2) (drink 2))
                       (sweet (cake 1) (drink 1))))
 
(defun apple-set-weight (set)
  "Given a list (apple-type (addon count)*), return the total weight using the data stored in *WEIGHTS*"
  (+ (second (assoc 'apple *weights*))
     ;; хвост списка - закуски; надо просуммировать произведения количества закуски на вес
     (loop :for (item count) :in (rest set)
           :summing (* count (second (assoc item *weights*))))))
 
(defun full-set (set)
  "Given an alist mapping apple types to quantities, return all the addons."
  (loop with h = (make-hash-table :test 'eq)
        for (apple-type apple-count) in set
        do (incf (gethash 'apple h 0) apple-count)
        do (loop for (addon addon-count) in (rest (assoc apple-type *sets*))
                  do (incf (gethash addon h 0) (* addon-count
                                                  apple-count)))
        finally (return
                  (loop for k being the hash-keys in h using (hash-value v)
                        collect (list k v)))))
 
(defparameter *set-weights* (mapcar (lambda (s)
                                      (list (first s)
                                            (apple-set-weight s)))
                                    *sets*)
  "The list of apple types with associated total weights (apple + addons)")
 
#|
Рекурсивное решение. Если дан только один вид яблок, достаточно проверить,
делится ли на него общий вес. Если дано несколько видов яблок, яблокам первого
типа даём значения, начиная от 0, пока укладываемся в общий вес, и пытаемся
решить задачу для остальных типов яблок с остатком веса.
|#
 
(defun solve (apples total-weight)
  "Solve!"
  (cond ((null apples) nil)
        ((null (rest apples))
         (let ((count (/ total-weight (second (assoc (first apples) *set-weights*)))))
           (if (integerp count)
               (list (list (list (first apples)
                                 count)))
               nil)))
        (t (loop with solution
                 with unit-weight = (second (assoc (first apples) *set-weights*))
                 for count upfrom 0
                 for weight from total-weight downto 0 by unit-weight
                 when (setf solution (solve (rest apples) weight))
                 nconc (mapcar (lambda (res)
                                   (cons (list (first apples) count) res))
                                 solution)))))
 
;;; Тестируем в репле
> (solve '(sour not-so-sour sweet) 1435)
(((SOUR 0) (NOT-SO-SOUR 8) (SWEET 1)) ((SOUR 1) (NOT-SO-SOUR 6) (SWEET 2))
 ((SOUR 2) (NOT-SO-SOUR 4) (SWEET 3)) ((SOUR 3) (NOT-SO-SOUR 2) (SWEET 4))
 ((SOUR 4) (NOT-SO-SOUR 0) (SWEET 5)))
> (mapcar (lambda (s) (list s (full-set s))) (solve '(sour not-so-sour sweet) 1435))
((((SOUR 0) (NOT-SO-SOUR 8) (SWEET 1)) ((APPLE 9) (CAKE 17) (DRINK 17)))
 (((SOUR 1) (NOT-SO-SOUR 6) (SWEET 2)) ((APPLE 9) (CAKE 17) (DRINK 17)))
 (((SOUR 2) (NOT-SO-SOUR 4) (SWEET 3)) ((APPLE 9) (CAKE 17) (DRINK 17)))
 (((SOUR 3) (NOT-SO-SOUR 2) (SWEET 4)) ((APPLE 9) (CAKE 17) (DRINK 17)))
 (((SOUR 4) (NOT-SO-SOUR 0) (SWEET 5)) ((APPLE 9) (CAKE 17) (DRINK 17))))
Форматировать в строку не стал, с format-ом баловались выше. Преимущество сырых данных в том, что их можно кидать от функции к функции ― например, full-set в данном случае. При этом они достаточно читаемые.
0
25.05.2015, 23:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2015, 23:41
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru