Подсчет слов, которые не начинаются с данной буквы - PullRequest
1 голос
/ 10 июля 2020

Итак, я написал эту функцию на Лиспе, которая подсчитывает, сколько слов в списке не начинается с данной буквы. Однако теперь мне нужно отредактировать его и не использовать «let» в моей функции (но оставить «char» и «string»). Чувствую себя немного заблокированным, так как начал работать с Lisp не так давно go! Кто-нибудь сможет мне помочь?

пример: (others 'n '(art nose foot nose take silence never)) => 4

Это то, что я сделал, но мне нужно удалить «let»:

(defun others (x liste)
  (let ((c (char (string x) 0)))
    (cond
      ((not liste) 0)
      ((char= (char (string (car liste)) 0) c) (others x (cdr liste)))
      (t (+ 1 (others x (cdr liste)))) ) ) )

Ответы [ 3 ]

2 голосов
/ 12 июля 2020

Другой встроенный способ:

> (count 'n
         '(art nose foot nose take silence never)
         :test #'(lambda (a b)
                   (string/= a b :end1 1 :end2 1)))
-> 4
1 голос
/ 11 июля 2020

Вот итеративная версия:

(loop for word in '("art" "nose" "foot" "nose" "take" "silence" "never")
      for c = #\n
      count (not (char= c (char word 0))))

(l oop можно узнать на примере с помощью https://lispcookbook.github.io/cl-cookbook/iteration.html)

1 голос
/ 10 июля 2020

Одно из решений - использовать переменную &aux в списке аргументов. Это позволяет вам связывать переменные в функции так же, как это делает let. Это в значительной степени способ использовать let в начале функции без явного использования let.

(defun others (x liste &aux (c (char (string x) 0)))
   (cond
      ((not liste) 0)
      ((char= (char (string (car liste)) 0) c) (others x (cdr liste)))
      (t (+ 1 (others x (cdr liste))))))
...