LINUX.ORG.RU

Код который не могу написать на common lisp

 , ,


0

2

Emacs lisp code

(mapcar (lambda (chr) 
          (if (eql chr ?.) 
              ?. 
              (- chr ?0))) 
        "123.45")
;; => (1 2 3 46 4 5)  ; . is 46 in ASCII 

Lispworks doesn't go.

Может кто-нибудь сможет перевести этот код на общий Лисп?

Aaa, наверное так

(map 'list '#(lambda (chr) 
          (if (eql chr ?.) 
              ?. 
              (- chr ?0))) 
        "123.45")
;; => попробовать не могу сейчас(1 2 3 46 4 5)  ; . is 46 in ASCII 



Последнее исправление: saufesma (всего исправлений: 3)
Ответ на: комментарий от lovesan

Классно!

а вот такое сможешь у себя провоерить у меня NIL выскакивает

(defvar teens-alist 
  '((0 . "") (10 . "десять") (11 . "одиннадцать") (12 . "двенадцать") 
    (13 . "тринадцать") (14 . "четырнадцать") (15 . "пятьнадцать") 
    (16 . "шестнадцать") (17 . "семнадцать") (18 . "восемнадцать") (19 . "девятнадцать")))


(defun get-num (alist n)
  (if (= n 0)
      (car alist)
    (get-num (cdr alist) (- n 1))))


(format t "~a тысяч" (cdr (assoc (+ (* (get-num '(1 2) 0) 10) (get-num '(1 2) 1)) teens-alist))) ;;=> NIL

должно быть «двенадцать тысяч»

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

Претензия не к синтаксису обратной польской нотации, а к семантике - замена рекурсий на императивщину, лямбда-исчисления Черча на машину Тьюринга.

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

Лаконично это вот так:

{x - "0"*~x="."} "123.45"


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

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

Сразу видно, не работал в проде с бидоном.

«Лаконичность» там заключается только названиях встроенных функций, которые необходимо делать короткими только как раз в исключительно verbose и отвратительно малоэкспрессивных языках

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

Небольшой набор операций на массивах, сочетая которые можно выражать куда более сложные функции на массивах.

Смотри, к примеру, примитивы в APL.

Да, и обычные арифметические операции в APL могут действовать поэлментно, в примере выше (который на K) по сути ничего кроме арифметики и не используется.

и почему в лиспе их нет

Ну я поискал сейчас и нашёл https://github.com/Lisp-Stat/array-operations. Но это выгляит как плохой клон numpy, который в свою очередь довольно таки плох.

Я не знаю, почему за 60 лет лисп ничему не научился у APL. Но я не лиспер, так что не знаю, насколько у вас всё плохо. Два массива чисел хотя бы складываются через `+` без дополнительных библиотек?

PS: да, я ещё вспомнил, что есть https://github.com/phantomics/april

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 2)
Ответ на: комментарий от quantum-troll

без дополнительных библиотек

А какой смысл этого требования? Всё равно что спрашивать, может ли ядро линукса без дополнительных библиотек вывести окно с кнопкой.

Два массива чисел хотя бы складываются через + без дополнительных библиотек?

В лиспе можешь переопределить себе + в своей программе во что хочешь. Без дополнительных библиотек.

monk ★★★★★
()

Усложним задачу: преобразовать строку в последовательность чисел, заменив цифры их значениями, а любые другие символы — их кодами ASCII.

(defn string-to-ints
  "Maps digits of string `s` to themselves and other characters to their ASCII codes."
  [s]
  (let [zero-code   (int \0)
        digit       (set (range 0 10))
        char-to-int (comp #(or (digit (- % zero-code)) %) int)]
    (map char-to-int s)))
(string-to-ints "-123.45e12")
;; => (45 1 2 3 46 4 5 101 1 2)

(string-to-ints "+123.45E-12")
;; => (43 1 2 3 46 4 5 69 45 1 2)
Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)