首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我得到“应用程序:而不是一个过程”这个循环在球拍?

为什么我得到“应用程序:而不是一个过程”这个循环在球拍?
EN

Stack Overflow用户
提问于 2022-07-12 19:14:50
回答 1查看 99关注 0票数 0

以下代码读取csv文件并根据其内容生成Prolog程序:

代码语言:javascript
复制
#!/usr/bin/env racket
#lang racket/base

(define (overwrite-s-to-f fname s); Will create fname and write overwriting the previous content. 
  (with-output-to-file #:exists 'truncate fname (lambda () (displayln s))))

(define (c-o-a-line-to-f fname s); Will append a string to fname or create it if does not exist. Appends a new line.
  (with-output-to-file #:exists 'append fname (lambda () (displayln s))));


(define fname "women.csv")
(define pl-fname "females-by-Racket.pl") 
(require racket/file)
(define content (file->lines fname))
(define disc-line (string-append ":-discontiguous(" (string-replace (car content) "Name," "") ").\n"))
(overwrite-s-to-f pl-fname disc-line)
(define list-of-verbs (string-split (string-replace (car content) "Name," "") ","))

(require racket/string racket/system)


(for ((row content));content is a list of strings
  (let ((list-of-cs (string-split row ",")))
    (when (equal? (car (cdr list-of-cs)) "+")
      (displayln row)(let ((cmd (string-append "awesome("(car list-of-cs)").")))(c-o-a-line-to-f pl-fname cmd)(displayln cmd)))
    (when (equal? (car (cdr (cdr list-of-cs))) "+")(displayln row)(let ((cmd (string-append "and_intelligent("(car list-of-cs)").")))
      (c-o-a-line-to-f pl-fname cmd)(displayln cmd))))); TODO: when for each columns 2-last of women.csv

women.csv含量

代码语言:javascript
复制
Name,awesome,and_intelligent,performed_once,extreme1,extreme2,extreme3,extreme4,donkey_thing,dark_eyes,pigmented_face,pigmented_genitals,bleached,had_no_surgeries,has_augmented_breasts
adriana_chechik,+,,,+,?,+,+,,-,,,,,
alysa_gap,+,,,,?,+,+,,-,,,,,
anna_de_ville,+,,,,,+,+,,+,-,+,-,-,
aurora_jolie,+,+,,,,,,,+,+,+,,+,
autumn_falls,,,,,,,,,+,+,-,+,+,
casey_calvert,+,,,,,,,,+,+,+,,,
dahlia_sky,+,,,,,,+,,,,,,,
dominica_lito,+,,,,,,+,,,,,,,
ella_knox,,,,,,,,,+,+,+,,+,
isabella_clark,+,,,,,,+,,,,,,,
jade_kush,,,,,,,,,+,+,,,+,
juelz_ventura,+,,,,,+,,,-,-,,,-,+
kapri_styles,,,,,,,,,+,,+,,,
kristina_milan,,,,,,,,,+,+,,,+,
kylie_sinner,+,+,,,,,,,+,,,,-,
leigh_raven,+,,,,,+,,,+,+,,,,
maserati,,,,,,,,,+,+,,,+,
miosotis,,,,,,,,,+,+,,,+,
scarlett_bloom,,,,,,,,,+,+,+,,-,
sheena_shaw,,,,,,,,,-,,+,,-,
sofia_rose,,,,,,,,,+,,,,+,
teanna_trump,+,,,,,,,,+,,+,,,
veronica_avluv,+,,,,,,+,,,,,,,
yudi_pineda,+,,,,,,,,+,+,,,,

females-by-Racket.pl看起来是这样的:

代码语言:javascript
复制
:-discontiguous(awesome,and_intelligent,performed_once,extreme1,extreme2,extreme3,extreme4,donkey_thing,dark_eyes,pigmented_face,pigmented_genitals,bleached,had_no_surgeries,has_augmented_breasts).

awesome(adriana_chechik).
awesome(alysa_gap).
awesome(anna_de_ville).
awesome(aurora_jolie).
and_intelligent(aurora_jolie).
awesome(casey_calvert).
awesome(dahlia_sky).
awesome(dominica_lito).
awesome(isabella_clark).
awesome(juelz_ventura).
awesome(kylie_sinner).
and_intelligent(kylie_sinner).
awesome(leigh_raven).
awesome(teanna_trump).
awesome(veronica_avluv).
awesome(yudi_pineda).

但是有更多的谓词(对于每个女性,n-1women.csv中的列数,n是这样)。

women.csv中的列名或其编号可能经常被更改。这就是为什么我希望避免为每个when手工编码。其他关注的问题是代码行的数量(每列为15 whens )和错误/错误的风险。在cell中循环遍历list-of-cs中的每个list-of-verbs,这样做是否可行呢?我尝试过这样做,但没有结果(注释显示了我得到的错误消息):

代码语言:javascript
复制
(for ((row content))
  (let ((list-of-cs (cdr (string-split row ","))))
    (for ((cell list-of-cs))
     ; application: not a procedure; expected a procedure 
     ; that can be applied to arguments
     (set! list-of-verbs (cdr (list-of-verbs)))
     (let ((verb (car list-of-verbs))) 
       (when (equal? cell "+")
         (displayln row)
         (let ((cmd (string-append verb "(" (car row) ").")))
           (c-o-a-line-to-f pl-fname cmd)))
       ))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-13 14:07:14

named let是一个需要熟悉的有用的表单:

代码语言:javascript
复制
#lang scheme

(define (csv->attributes rows) ;; ListOfString -> ListOfString
  ;; produce "column-header(row-name)" for "+" entries in csv (see example)
  (let ([fields (string-split (car rows) ",")])
    (let next-row ([rows (cdr rows)] [result (list)])
      (cond
        [(null? rows) (reverse result) ]
        [else
         (let* ([cells (string-split (car rows) ",")]
                [name  (car cells)])
           (let next-cell ([cells (cdr cells)] [fields (cdr fields)] [result result])
             (cond
               [(null? cells) (next-row (cdr rows) result) ]
               [else (next-cell
                      (cdr cells) (cdr fields)
                      (if (string=? (car cells) "+")
                          (cons (string-append (car fields) "(" name ")") result)
                          result)) ]))) ]))))

(define trio '("Name,fast,slow,sidles"
               "Achilles,+,,"
               "Tortoise,,+,"
               "Crab,,+,+"))
代码语言:javascript
复制
Welcome to DrRacket, version 8.5 [cs].
Language: scheme, with debugging.
> (csv->attributes trio)
("fast(Achilles)" "slow(Tortoise)" "slow(Crab)" "sidles(Crab)")
> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72957312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档