Scheme让运算符成为列表中的过程

时间:2015-11-17 04:41:26

标签: list scheme operators

我希望从列表中获取一个操作符,而不是符号。

例如,假设我想使用'(- a 3)构建此列表:cons

如果我要放((car '(- a 3)) 5 3),则应打印2。但是,由于-位于列表中,因此获取列表的car仍然是符号而不是实际运算符。

这里的问题是我必须使用cons来构建(- a 3)列表(并将其打印出来)。我的教授会在car前面添加5 3,最后应该2打印(cons '- (cons 'a (cons '3 '())))

所以我目前有这个:(- a 3),打印出car

如果我添加5 3((car (cons '- (cons 'a (cons '3 '())))) 5 3)not a procedure,则会收到错误消息import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import com.toedter.calendar.JDateChooser; import com.toedter.calendar.JMonthChooser; public class test extends JFrame { /** * */ private static final long serialVersionUID = 2513170924764415427 L; private JPanel contentPane; private JDateChooser dateChooser; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { test frame = new test(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public test() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JMonthChooser monthChooser = new JMonthChooser(); monthChooser.setBounds(41, 45, 94, 20); contentPane.add(monthChooser); dateChooser = new JDateChooser(); dateChooser.setDateFormatString("yyyy-MM-dd"); dateChooser.setBounds(41, 108, 242, 30); contentPane.add(dateChooser); JButton btnClick = new JButton("CLICK"); btnClick.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); /*Date nextMonth = addDays(dateChooser.getDate(),7); JOptionPane.showMessageDialog(null,df.format(nextMonth),null, getDefaultCloseOperation());*/ /*JOptionPane.showMessageDialog(null,df.format(setDateofMonth(6)),null, getDefaultCloseOperation());*/ Calendar cal = Calendar.getInstance(); int monthnow = cal.get(Calendar.MONTH); int yearnow = cal.get(Calendar.YEAR); int daynow = cal.get(Calendar.DAY_OF_MONTH); int termspermonth = 4; int monthlyschedule = 4; int day1 = 1; int day2 = 8; int day3 = 15; int day4 = 22; for (int x = 0; x < 4; x++) { for (int i = 0; i < 31; i++) { if (i == day1) { System.out.println(df.format(setDateofMonth(yearnow, monthnow + x + 1, day1))); } if (i == day2) { System.out.println(df.format(setDateofMonth(yearnow, monthnow + x + 1, day2))); } if (i == day3) { System.out.println(df.format(setDateofMonth(yearnow, monthnow + x + 1, day3))); } if (i == day4) { System.out.println(df.format(setDateofMonth(yearnow, monthnow + x + 1, day4))); } } } } }); btnClick.setBounds(110, 194, 91, 23); contentPane.add(btnClick); } public static Date setDateofMonth(int year, int month, int day) { Calendar cal = Calendar.getInstance(); cal.set(year, month - 1, day); System.out.println(new SimpleDateFormat("MMMM").format(cal.getTime())); Date date = cal.getTime(); return date; }

有人可以提供一些指导吗?我不知道该怎么办。

1 个答案:

答案 0 :(得分:2)

然后使用:(cons - (cons 'a (cons 3 '())))。也就是说,不要引用-。这将使用-过程而不是符号。

> ((car (cons - (cons 'a (cons 3 '())))) 5 3)
2

这可以写成一个准引用列表,作为简写:

> ((car `(,- a 3)) 5 3)
2

在一个quasiquoted数据中 - 也就是说,使用反引号而不是引号 - 前面带逗号的任何内容都是不带引号的。 (内部没有逗号的quasiquote与引号相同。)