LINUX.ORG.RU

destructuring-bind не могу прочитать в реальном коде

 ,


0

2

не могу прочитать

(defun cached-display-draw-an-arrow  (pane x y width height)
  (declare (ignore x y width height))
  (when-let (dragging-info (capi:output-pane-cached-display-user-info pane))
    (destructuring-bind (center-x center-y end-x end-y)
        dragging-info    --------  >>>>>>>это место просто вышибает
      (let* ((diff-x (- end-x center-x))
             (diff-y (- end-y center-y))
             (len-square (+ (* diff-x diff-x) (* diff-y diff-y))))
        (when (> len-square 5) ;; don't try too short
          (let* ((len (sqrt len-square))
                 (angle (atan diff-y diff-x))
                 (scale (/ len 100)))
            (gp:with-graphics-translation (pane center-x center-y)
              (gp:with-graphics-rotation (pane angle)
                (gp:with-graphics-scale (pane scale 1)
                  (cached-display-internal-draw-an-arrow pane))))))))))

(destructuring-bind (parameter*) list
  body-form*) здесь всё понятно, а в
примере приведённом выше не могу понять где vars list form

(destructuring-bind (x y z) (list 1 2 3)
  (list :x x :y y :z z)) ==> (:X 1 :Y 2 :Z 3) 
The form

(when-let (position (search string1 string2))
   (print position))

macroexpands to

(let ((position (search string1 string2)))
   (when position
      (print position)))

в примере приведённом выше не могу понять где vars list form

(center-x center-y end-x end-y) ; vars
dragging-info ; list
(let* ...) ; form
(let ((dragging-info (list 1 2 3 4)))
  (destructuring-bind (center-x center-y end-x end-y)
      dragging-info
    (let ((foo (+ center-x center-y)))
      (format t "c-x: ~a ; c-y: ~a ; e-x: ~a ; e-y: ~a~%"
              center-x center-y end-x end-y)
      (format t "foo: ~a~%" foo))))

https://rextester.com/SNN17935

korvin_ ★★★★★
()
Последнее исправление: korvin_ (всего исправлений: 1)
Ответ на: комментарий от korvin_
(when-let (dragging-info (capi:output-pane-cached-display-user-info pane))

получается эта строчка вводит в заблуждение.

output-pane-cached-display-user-info       Function

Summary

Gets and sets the user-info in the current cached display of an output pane.

Package
capi

Signature

output-pane-cached-display-user-info pane => user-info

(setf output-pane-cached-display-user-info) user-info pane

Arguments
pane    An output-pane.

Values
user-info A Lisp object.

ведь user-info is a Lisp object, а как заранее знать, что этот object есть list? В документации ни слова об этом. С другой стороны, ты же не знаешь, что возвращает функция output-pane-cached-display-user-info но определённо знаешь, как работает destructuring-bind, как тогда подходить к написанию кода если не знаешь, какой именно object возвращает та или иная функция?

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 3)
Ответ на: комментарий от saufesma

Если я правильно понял, что за Lisp object будет определяется тем, что ранее в него самой программой было задано (через setf). Тут всё на совести автора - задавать именно те значения, которые он потом будет ожидать при считывании.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Спасибо!

(defun cached-display-press-button-1 (pane x y)
  (capi:start-drawing-with-cached-display pane 'cached-display-draw-an-arrow
         вот оно  >>>>>>>>>>>>>>>>>>> :user-info (list x y x y)))

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 3)

– Как я узнаю, что язык выбрал меня?

– Он захочет взорвать тебе мозг.

где vars list form

Вот же он: (center-x center-y end-x end-y). Из списка dragging-info вытаскиваются значения и связываются с соответствующими по порядку символами в vars list form. Я не настоящий борщеед, но обычно деструктуризация примерно так работает.

Или, может, я не понял сути затруднений.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от Nervous

Ну REPL же есть, взял бы да посмотрел. Чо как сишарпер-то.

У меня не всегда получается это сделать, то времени нет то не сообразил, что мне надо.

saufesma
() автор топика
Ответ на: комментарий от ox55ff

Отличный вброс. Код который недостаточно опытному программисту невозможно прочитать можно написать на:

C, C++, Python, Perl, JavaScript, bash, Haskell… Это из более-менее популярных. Все однозначно дно.

Gentooshnik ★★★★★
()
Ответ на: комментарий от Gentooshnik

Нечитаемый код на цпп и нечитаемый код на брейнфаке это разные нечитаемые коды. Согласись. Однозначно, порог начала нечитаемости на лиспе сильно ниже чем на цпп.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Однозначно, порог начала нечитаемости на лиспе сильно ниже чем на цпп.

Лол, соглашусь с обратным. Но суть не в этом. Суть в том что здесь вывод делается на основании одного случая.

EDIT: При наличии примерно одинакового опыта в цпп и лиспе, конечно же. Если ты всю жизнь кодил на Java, C#, C, то порог нечитаемости лично для тебя на цпп очевидно будет выше чем на лиспе, хаскеле, эрланге.

Gentooshnik ★★★★★
()
Последнее исправление: Gentooshnik (всего исправлений: 1)
Ответ на: комментарий от Gentooshnik

Лол, соглашусь с обратным.

Всё шуточки шутишь. Загуглил кусок твоего лишпа для элементарного квадратного уравнения

(/ (- (- ,b) (sqrt D)) (* 2 ,a)))
;;;                   ^
;;;                   ^
;;; сколько секунд ты потратишь на определение оператора, который применяется между этими скобками?

Ну да, (/ (- (- вот прям сразу понятно какой оператор к чему относится. Будешь и дальше шланговать, говоря что лишп-лапша читается лучше чем

((-b) + sqrt(d)) / (2 * a)
//               ^
//               ^
// а ручки-то вот они :)

А если длину выражения увеличить в два раза? В три? Уже представляю какое-нибудь километровое(* (/ ( * ( - с не менее километровой стопкой )))))) в конце.

Отдыхай.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

О, специальная олимпиада по шлангованию объявляется открытой? xD В лисповом коде ТРИ ошибки, плюсовый нельзя вставить в произвольное выражение из-за приоритетов, формулы находят разные корни уравнения. Ниже всё поправил.

Но что если ещё и вопрос задать немного по-другому?

((sqrt(d) - b) / (2 * a))
// Сколько секунд ты потратишь чтобы определить какой оператор выполняется последним?
(/ (- (sqrt d) b) (* 2 a))
;^ 
;^
;не вопрос

Да собственно и на твой вопрос ответ становится очевидным если просто исправить ошибки. А выражение в три раза длиннее на обоих языках либо форматируется в столбик, либо реализуется через промежуточные переменные, либо становится одинаково нечитаемой кашей.

Ну что, отдыхаешь или Олимпиада ещё не закончена? xD

Gentooshnik ★★★★★
()
Ответ на: комментарий от Gentooshnik

плюсовый нельзя вставить в произвольное выражение из-за приоритетов

Чего? Не знаешь про скобки, которыми можно поправить приоритет? Нашёл фатальный недостаток.

Сколько секунд ты потратишь чтобы определить какой оператор выполняется последним?

Шланг, зачем мне знать какой оператор выполнится последним? Это здесь он последний. В более длинном выражении может быть не последним и уже не поможет ссылка на самый левый оператора в строке. Чё тогда будешь делать? Тебе пришёл на ревью код другого человека и ты убиваешь кучу времени на сопоставление парных скобок вместо работы. То то лиспа в бизнесе не видать. Одно дело задродствовать дома, а другое решать задачи.

А выражение в три раза длиннее на обоих языках либо форматируется в столбик

// обычный многочлен, без изысков. Читается легко и непринуждённо.
// в столбик переписывать не нужно.
k1 * pow(x, 1) + k2 * pow(x, 3) - k3 * pow(x, 4) + k4 * pow(x, 6)
;;; Я попытался переписать на этот ваш лишп
;;; ряяяяя, зато я знаю какой оператор выполнится последним xD
(+ (- (+ (* k1 (pow x 1)) (* k2 (pow x 3))) (* k3 (pow x 4))) (* k4 (pow x 6)))

Ну вот мы и пришли к тому с чего начали

Однозначно, порог начала нечитаемости на лиспе сильно ниже чем на цпп.

На лиспе стоит только превысить порог в четыре оператора на выражение и тебе уже приходится форматировать в столбик. Ч.Т.Д.

Контрольный выстрел:

tiobe: 30 Lisp 0.37%
stack overflow: 32 LISP 1.33%
pypl: лишпа нет в списке :(

Половина языков из рейтингов появилась позже лишпа, но уже на порядок его обогнали по популярности. Это позор. Мда, что-то не хотят люди писать на «легкочитаемом» языке. Наверное что-то не знают. Но ты сейчас конечно же пояснишь, что всё наоборот или всё-таки пойдёшь отдохнуть? 😏

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff
(+ (* k1 (pow x 1)) (* k2 (pow x 3)) (- (* k3 (pow x 4))) (* k4 (pow x 6)))

читается не сложнее, чем в инфиксной записи. А если таких хотя бы два в коде, то всё равно будет функция типа

(poly x 
      k1 1 
      k2 3
      (- k3) 4
      k4 6)

Который ещё и считаться быстрее будет, так как может вычислять степени в один проход, а не каждую перемножать по отдельности.

monk ★★★★★
()