LINUX.ORG.RU

cond или case из которого можно вернуть значение

 ,


1

2

Предупрежу, что в схемах и лиспах я нуб. Решил ради интереса порешать задачки на ракете. Задача заключается в том, чтобы перебрать строку и посчитать очки за каждую букву, разные буквы стоят разное количество очков. Накидал вот такое решение:

#lang racket

(define (score word)
  (for/sum ([i (string->list word)])
    (case i
      [('A 'E 'I 'O 'U 'L 'N 'R 'S 'T) 1]
      [('D 'G) 2]
      [('B 'C 'M 'P) 3]
      [('F 'H 'V 'W 'Y) 4]
      [('K) 5]
      [('J 'X) 8]
      [('Q 'Z) 10])))

Но столкнулся с тем, что case возращает #<void>, Переписал на cond, но он тоже возвращает #<void>. Неужели без дополнительной переменной sum не обойтись?

А в слове-то все буквы в верхнем регистре что ли? К тому же string->list, если верить докам, возвращает список строковых символов, а не лисп символов.

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

Да, я это уже все поправил. И #<void> возвращался как раз потому что я пытался сравнить строковый символ и лисп символ.

(define (score word)
  (for/sum ([i (string->list (string-upcase word))])
    (case i
      [(#\A #\E #\I #\O #\U #\L #\N #\R #\S #\T) 1]
      [(#\D #\G) 2]
      [(#\B #\C #\M #\P) 3]
      [(#\F #\H #\V #\W #\Y) 4]
      [(#\K) 5]
      [(#\J #\X) 8]
      [(#\Q #\Z) 10])))
snake266 ★★
() автор топика
Ответ на: комментарий от snake266

Как в современном Прологе, например:

?- [X, Y, Z] = "cat".
   X = c, Y = a, Z = t.
?- use_module(library(lists)).
   true.
?- reverse([1, 2, 3], X).
   X = [3,2,1].
?- reverse("cat", X).
   X = "tac".
?- [X | Y] = [1, 2, 3].
   X = 1, Y = [2,3].
?- [X | Y] = "some string".
   X = s, Y = "ome string".
?-

Естественно, во внутреннем представлении строки не надо хранить как списки.

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

В Эрланге это жопа. Там даже отдельного типа для символов нет, строки – это списки интов. Если они входят в ascii, print() выводит буквы. Если нет, выводит числа. У нас так в логах как-то раз IP буквами печатались.

Ну или так раньше было. Я не трогал энларг уже несколько лет.

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

Давно на Эрланге не писал, но что-то такое припоминаю. Тут вроде все довольно удобно, инты – отдельный тип. В Scheme/ML часто ловлю себя на мысли, что было бы здорово обрабатывать строки как списки, но надо делать string->list/list->string или explode/implode.

Кроме того, это поведение в Прологе можно отключить.

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

Тут вроде все довольно удобно, инты – отдельный тип.

Я удивлён, что пролог ещё жив. Потому что я про него слышу ещё реже чем про ML.

В Scheme/ML часто ловлю себя на мысли, что было бы здорово обрабатывать строки как списки, но надо делать string->list/list->string или explode/implode.

А чо, там нету такого? В том же хачкелле есть String, который на самом деле [Char]. А так все используют Text.

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

Я удивлён, что пролог ещё жив. Потому что я про него слышу ещё реже чем про ML.

Ну, если судить по TIOBE, то он популярнее, например, котлина, перла, хаскеля, скалы и всяких лиспов. В реальности – академическая разработка какая-никакая есть, реализации потихоньку развиваются, какие-то новые фичи пилятся.

А чо, там нету такого?

В Scheme точно нет, в OCaml есть ряд функций типа map для строк, в SML строки – это векторы символов со всеми вытекающими.

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

Ну, если судить по TIOBE, то он популярнее, например, котлина, перла, хаскеля, скалы и всяких лиспов.

В то, что Prolog популярнее перла, я ещё могу поверить. А вот про остальные – вряд ли. Плюс, TIOBE – не то чтобы адекватная метрика. Я бы смотрел по количеству строк на гитхабе за, например, последний год.

hateyoufeel ★★★★★
()