2020-03-26lisp学习-17

84/ mod,返回相除后的余数

5 > (mod 27 5)
2
5 > (mod 35 5)
0


85/ 日期计算函数


6 > (defconstant month
  #(0 31 59 90 120 151 181 212 243 273 304 334 365));;;设定向量,一维数组

(defconstant yzero 2000);;设定向量,单值

(defun leap? (y);;函数名及形参。判断y年是否为闰年,是T,否nil
  (and (zerop (mod y 4));;;判断实参/4的余值是否为0,是真,否假。闰年的必要条件
       (or (zerop (mod y 400));;;判断实参/400的余值是否为0,是真,否假,与后一个表达式并列或的关系。世纪闰年的必要条件
           (not (zerop (mod y 100)))   ;;判断实参/100的余值是否为0,是假,否真,与前一个表达式并列或的关系。普通闰年的必要条件

        )))

闰年是公历中的名词。闰年分为普通闰年和世纪闰年。

普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004年就是闰年);

世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年);

闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天)。

注意闰年(公历中名词)和闰月(农历中名词)并没有直接的关联,公历中只分闰年和平年,平年有365天,而闰年有366天(2月中多一天);平年中也可能有闰月(如2017年是平年,农历有闰月,闰6月)。

(defun date->num (d m y);;;函数名及形参。计算y年m月d日之前已累积天数
  (+ (- d 1) (month-num m y) (year-num y)));;;表达式,天-1,

(defun month-num (m y);;;函数名及形参,月份及年份。计算y年m月之前已累积天数
  (+ (svref month (- m 1));;;month数组中取出相应位置的数值,此为当年月份的累积数值
     (if (and (> m 2) (leap? y)) 1 0)));;;判断月份大于2,且为闰年,两者都真,则+1,有一个不为真则+0

(defun year-num (y);;;函数名及形参。Y年以前的累积天数,从2000年1月1日起开始计算。如2001年,返回2000年全年天数
  (let ((d 0));;;变量及赋值
    (if (>= y yzero);;;;判断y是否大于等于yzero(2000基准年),是真,否假
        (dotimes (i (- y yzero) d);;;真,年份差值赋值给i
          (incf d (year-days (+ yzero i))));;;年份差间每年的天数,从0开始累加,d为累加值存储器
        (dotimes (i (- yzero y) (- d));;;假,年份差值赋值给i,逆加,即2000年之前年份的值为负向累加
          (incf d (year-days (+ y i)))))));;年份差间每年的天数,从0开始累加,d为累加值存储器

;incf递增运算符,所指定的第二个参数增加整数。假设A初始值为10,(incf A 3) = 13,即在A上增加3值

(defun year-days (y) (if (leap? y) 366 365));;;函数名及形参,判断y是否闰年,是取值366,否365

MONTH
6 > YZERO
6 > LEAP?
6 > DATE->NUM
6 > MONTH-NUM
6 > YEAR-NUM
6 > YEAR-DAYS

验证:

5 > month
#(0 31 59 90 120 151 181 212 243 273 304 334 365)

6 > (year-num 2001)
366
6 > (year-num 2000)
0
6 > (year-num 2002)
731
6 > (year-num 1999)
-365

6 > (month-num 1 2020)

0

6 > (month-num 2 2020)

31

6 > (month-num 3 2020)

60

5 > (leap? 2200)

NIL

5 > (leap? 2400)

T

6 > (date->num 1 1 2001)
366
6 > (date->num 31 12 2000)
365
6 > (date->num 2 1 2001);;;不含当天,即当天之前的天数,从2000年1.1(含)开始
367

以上为先计算某日到基准日的天数


以下为继续计算从当日计算开始,多少天前后的日期是多少,逆转换

1 > (defun num->date (n);;;函数名及形参
  (multiple-value-bind (y left) (num-year n)
    (multiple-value-bind (m d) (num-month left y)
      (values d m y))))

(defun num-year (n);;;函数名及形参
  (if (< n 0);;判断n是否小于0,是真,否假
      (do* ((y (- yzero 1) (- y 1));;;真,设变量,当下值参与循环
            (d (- (year-days y)) (- d (year-days y))))
           ((<= d n) (values y (- n d))));;;条件语句,
      (do* ((y yzero (+ y 1));;;假
            (prev 0 d)
            (d (year-days y) (+ d (year-days y))))
           ((> d n) (values y (- n prev))))))

(defun num-month (n y)
  (if (leap? y)
      (cond ((= n 59) (values 2 29))
            ((> n 59) (nmon (- n 1)))
            (t        (nmon n)))
      (nmon n)))

(defun nmon (n)
  (let ((m (position n month :test #'<)))
    (values m (+ 1 (- n (svref month (- m 1)))))))

(defun date+ (d m y n)
  (num->date (+ (date->num d m y) n)))
NUM->DATE
1 > NUM-YEAR
1 > NUM-MONTH
1 > NMON
1 > DATE+

验证:

1 > (multiple-value-list (date+ 17 12 1997 60))
(15 2 1998)
1 > (multiple-value-list (date+ 17 12 1997 30))
(16 1 1998)
1 >

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容