Язык Common LISP: Удалить Функция, как это используется?

margin: 0 auto - отличный ответ, но вы также можете использовать для этого переводчик;

/* start set fonts */
* {
    font-family: 'Montserrat', sans-serif;
    margin: 0;
    padding: 0;
}

/* start general page */
html body {
    background-color: #181333;
}

/* start container */
.container {
    width: 100%;
    background-color: #1e1939;
    position: absolute;
    top: 50%;
}

/* start title */
.title {
    display: block;
    margin: 5px;
    padding: 5px;
    color: #fefefe;
    text-align: center;
    letter-spacing: 15px;
}

/* start main line */
.main_line {
    display: block;
    width: 5%;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
}
<div class="container">
<h1 class="title">OUR TEAM</h1>
<hr class="main_line">
 </div>

5
задан BlueBadger 21 March 2009 в 15:24
поделиться

4 ответа

Учитесь читать язык Common LISP HyperSpec.

Строки являются Последовательностями, Массивами (одномерные векторы символов) и, ну, в общем, Строки. Это означает, что большинство тех функций применимо.

Давайте посмотрим на, УДАЛЯЮТ. CLHS дает эту подпись:

remove item sequence &key from-end test test-not start end count key
    => result-sequence

Строки являются последовательностями символов. Таким образом, вызов для удаления был бы:

(remove #\/ "/foo/")

или (например)

(remove #\/ "/foo/" :start 2)

Помните: #\\символа. #\\узел не является никаким символом. Недопустимый. Строка является "/нечто /".

Объект для УДАЛЕНИЯ из строки должен быть символом. Ничто иное. Почему? Поскольку ТЕСТОМ является по умолчанию EQL, и EQL сравнивает символ в строке с Вашим аргументом объекта. Также ключ ИДЕНТИФИКАЦИОННЫМИ ДАННЫМИ по умолчанию и не изменяет объекты.

Что, если Вашим аргументом является строка? Ну, затем необходимо сделать больше:

 (remove "/" "/abc/" :key #'string :test #'equal)

Это смотрит на каждый символ последовательности и превращает его в строку. Строка затем будет по сравнению с Вашим объектом "/" использование РАВНОЙ функции. Это работает также. Стоимость - то, что это должно генерировать строку от каждого символа "/abc /", каждая строка является новым объектом.

Другой способ сделать это:

 (remove "/" "/abc/" :test (lambda (a b) (eql (aref a 0) b)))

Выше получает первый символ "/" в каждом тесте и сравнивает его с символом от строки "/abc /". Снова стоимость - то, что это должно получить символ пять раз (в этом примере).

Так лучший способ записать это, если Ваш исходный объект стал строкой:

(remove (aref "/" 0) "/abc/")

Выше мы получаем символ от строки "/" однажды и затем УДАЛЯЕМ, сравнивает этот символ с тестом EQL по умолчанию с каждым символом в строке - это возвращает новую строку тех символов, которые не являются EQL к #/.

Что Вы ожидаете? \foo, чтобы быть? В языке Common LISP это - символ |? НЕЧТО |.

Также (удаляют "нечто" "afoob") не работает, так как строка ("нечто" здесь) не является элементом строки. Помните, символы являются элементами строк. Помните также, что строки с одним объектом как "/" являются все еще строками и не символом. Таким образом "/" и #/имеют другой тип. Первой является строка, и вторым является символ.

SUBSEQ извлекает последовательность из последовательности. Это означает, что также извлекает строку из другой строки:

(subseq "0123456" 1 5)
     where 1 is the start and 5 is the end index.

КОНКАТЕНИРУЙТЕ добавляет последовательности. Это означает, что также добавляет строки.

(concatenate 'string "abc" "123")
  returns a new string with the strings "abc" and "123" appended.

Для удаления частей строки, см. также СТРОКОВУЮ ОБРЕЗКУ функций, СТРОКОВУЮ ЛЕВУЮ ОБРЕЗКУ и СТРОКОВУЮ ПРАВИЛЬНУЮ ОБРЕЗКУ.

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

ИЩИТЕ ищет строки в строках.

4
ответ дан 14 December 2019 в 04:48
поделиться

Объяснение:

(remove "node" request-uri)
(remove 'node request-uri)
(remove ?\node request-uri)
(remove #\node request-uri)
(remove '("node") request-uri)

Это (соответственно): строка, (заключенный в кавычки) символ, (оцененный) символ, уродливый символьный литерал и список, содержащий одну строку. УДАЛИТЕ удаляет объект из последовательности объекта, и строка не является последовательностью ни одной из этих вещей.

Если Вы просто хотите удалить часть строки, SUBSEQ мог бы добиться цели:

(let ((uri "/node/143"))
  (when (string= (subseq uri 0 6) "/node/")
    (format t "user wants node ~D" (parse-integer (subseq uri 6)))))

Для более сложных вещей Вы, вероятно, хотите библиотеку как статья-ppcre и/или последовательность разделения. (При использовании Hunchentoot Вы уже имеете, первый загрузился.)

2
ответ дан 14 December 2019 в 04:48
поделиться

Для удаления целой подстроки необходимо будет сделать новую функцию, например:

(defun remove-string (rem-string full-string &key from-end (test #'eql)
                      test-not (start1 0) end1 (start2 0) end2 key)
  "returns full-string with rem-string removed"
  (let ((subst-point (search rem-string full-string 
                             :from-end from-end
                             :test test :test-not test-not
                             :start1 start1 :end1 end1
                             :start2 start2 :end2 end2 :key key)))
    (if subst-point
        (concatenate 'string
                     (subseq full-string 0 subst-point)
                     (subseq full-string (+ subst-point (length rem-string))))
        full-string)))

Это - просто начальная точка. Я копировал все опции для ПОИСКА, но я думаю, что некоторые опции не имеют смысла в этом контексте. По крайней мере, это работает:

(remove-string "node" "this is a node or not")

Для более тщательно продуманных случаев необходимо, возможно, смотреть на статью-ppcre, regex библиотеку.

2
ответ дан 14 December 2019 в 04:48
поделиться

Это перестало работать, потому что "/" строка, не символ.

(remove "/" request-uri)
"/node/143"

Если Вы хотите символ, необходимо использовать #/т.е. символ наклонной черты вправо.

(remove #\/ request-uri)
"node143"

Но как Вы видите, это удалит все наклонные черты вправо. Согласно странице документа Вы связались, удалите, берет названный параметрический усилитель ключевого слова: количество, которое говорит сколько объектов для удаления. Таким образом, Вы могли сделать это.

(remove #\/ request-uri :count 1)
"node/143"

Надеюсь, это поможет.

::Править::

Это не?/, это #/. Спасибо Douglas!

0
ответ дан 14 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: