Emacs Lisp: Как суммировать нечетные числа в списке?

Прежде чем использовать метод passes(), вам необходимо войти в систему, иначе auth()->user() будет нулевым. Вы можете сделать это, используя метод be($user) следующим образом:

/** @test */
public function current_password_must_be_valid()
{  
  $rule = new CurrentPassword();
  $user = factory(User::class)->create(['password' => '1234']);
  $this->be($user);
  $this->assertTrue($rule->passes('current_password','1234'), $user->password);
}

Также было бы целесообразно принять меры против значений null в вашем методе passes(), чтобы избежать ошибок. Если пользователь не вошел в систему, вероятно, он просто должен вернуть false.

7
задан Community 23 May 2017 в 12:25
поделиться

2 ответа


(apply '+ (delq nil (mapcar (lambda (x) (and (= 1 (% x 2)) x)) '(1 2 3 4 5))))
6
ответ дан 6 December 2019 в 08:17
поделиться

Идиоматический способ сделать это состоит в том, чтобы использовать функции и макросы в cl пакеты. Они стали стандартом с Lisp Emacs и нет ничего неправильно с использованием их.

Я сомневаюсь, что Вы найдете способ сделать это, это так же кратко и ясно как

(loop for x in list if (oddp x) sum x)

Существуют более функциональные способы сделать это, такой как

(apply #'+ (remove-if-not #'oddp list))

но это использует remove-if-not который является от cl-seq пакет. Вы могли выписать цикл вручную:

(let ((sum 0)) (dolist (x list sum) (when (oddp x) (incf sum x))))

но это использует dolist и incf которые находятся оба в cl-macs пакет. В основном Вы не можете выйти cl пакет: oddp самостоятельно a cl функционируйте!

Мои максимальные усилия, не используя абсолютно никакой cl средства - это:

(apply #'+ (mapcar (lambda (x) (* x (mod x 2))) list))

но это было бы абсурдный для использования этого на практике вместо (loop ...) версия.

14
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

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