Common Lisp - Получить docstring из методов и функций?

Если ширина содержимого неизвестна, вы можете использовать следующий метод. Предположим, что у нас есть эти два элемента:

  • .outer - полная ширина
  • .inner - не установлена ​​ширина (но может быть указана максимальная ширина)

Предположим, что вычисленная ширина элементов равна 1000px и 300px соответственно. Выполните следующие действия:

  1. Оберните .inner внутри .center-helper
  2. Сделайте .center-helper встроенным блоком; он становится того же размера, что и .inner, делая его шириной 300 пикселей.
  3. Нажмите .center-helper на 50% относительно родителя; это помещает его влево на 500px wrt. внешний.
  4. Push .inner 50% слева относительно его родителя; это помещает его левое на -150px wrt. который означает, что его левый угол равен 500 - 150 = 350px.
  5. body {
      font: medium sans-serif;
    }
    
    .outer {
      overflow: hidden;
      background-color: papayawhip;
    }
    
    .center-helper {
      display: inline-block;
      position: relative;
      left: 50%;
      background-color: burlywood;
    }
    
    .inner {
      display: inline-block;
      position: relative;
      left: -50%;
      background-color: wheat;
    }
    <div class="outer">
      <div class="center-helper">
        <div class="inner">
          <h1>A div with no defined width</h1>
          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
              Duis condimentum sem non turpis consectetur blandit.<br>
              Donec dictum risus id orci ornare tempor.<br>
              Proin pharetra augue a lorem elementum molestie.<br>
              Nunc nec justo sit amet nisi tempor viverra sit amet a ipsum.</p>
        </div>
      </div>
    </div>
    ]

    .outer {
        overflow: hidden;
    }
    .center-helper {
        float: left;
        position: relative;
        left: 50%;
    }
    .inner {
        float: left;
        position: relative;
        left: -50%;
    }
    
    3
    задан Julien Vincenot 13 July 2018 в 10:27
    поделиться

    1 ответ

    Функции имен символов, включая макросы и общие функции, но не методы. Чтобы однозначно идентифицировать метод, вам нужно знать общую функцию и все применимые модификаторы и специализированные функции.

    Например, PRINT-OBJECT называет общую функцию, но недостаточно для обозначения конкретных методов. Однако вы можете перебирать все методы, специализирующиеся на общей функции, и манипулировать их документацией: вместо передачи имени в DOCUMENTATION вы предоставляете объект функции и T. Чтобы сделать это переносимо, используйте close-mop :

    (ql:quickload :closer-mop)
    

    Например:

    (lambda (generic-function)
      (map 'list
           (lambda (method) (documentation method t))
           (closer-mop:generic-function-methods generic-function)))
    => #<FUNCTION (LAMBDA (GENERIC-FUNCTION)) {1001BBCD3B}>
    

    Попробуем:

    CL-USER> (funcall * #'documentation)
    (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
    

    Упс.

    CL-USER> (defmethod documentation ((test (eql :test)) _) 
                 "Test documentation" 
               "Returned value")
    ...
    CL-USER> (documentation :test t)
    "Returned value"
    
    CL-USER> (funcall *** #'documentation)
    ("Test documentation" NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
    
    4
    ответ дан coredump 17 August 2018 в 13:08
    поделиться